Filter过滤器
Fileter过滤器基本使用
一、Filter简介
Filter也称之为过滤器,通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。也开始实现高级功能如:实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等。
二、Filter的原理
三、Filter如何实现拦截
自定义一个java类,实现Filter接口,重写Filter中的三个方法init、doFilter、destory。当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法从而实现拦截。
四、Filter开发入门
Filter开发步骤
- 实现Filter接口,重写方法。
- 配置web.xml或添加@WebFilter。
具体实现如下:
web.xml: <filter> <filter-name>MyServlet</filter-name> <filter-class>com.example.Filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyServlet</filter-name> <url-pattern>/Myservlet</url-pattern> </filter-mapping>
或
@WebFilter(filterName = "MyFilter",urlPatterns = "/MyServlet")
使用范例:
index.jsp
<html>
<head>
<title>过滤器使用测试</title>
</head>
<body>
<a href="MyServlet">MyServlet</a>
</body>
</html>
@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("访问服务器...");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
MyServlet.java
@WebServlet(name = "MyServlet", value = "/MyServlet") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("访问服务器..."); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
MyFilter.java
@WebFilter(filterName = "MyFilter",urlPatterns = "/MyServlet") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("拦截请求..."); filterChain.doFilter(servletRequest, servletResponse); System.out.println("拦截响应..."); } @Override public void destroy() { } }
Filter链
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
Filter的部署
Filter的部署分为两个步骤
- 注册Filter
- 映射Filter
注册Filter
<filter>
<description>FilterDemo02过滤器</description>
<filter-name>FilterDemo02</filter-name>
<filter-class>me.gacl.web.filter.FilterDemo02</filter-class>
<!--配置FilterDemo02过滤器的初始化参数-->
<init-param>
<description>配置FilterDemo02过滤器的初始化参数</description>
<param-name>name</param-name>
<param-value>gacl</param-value>
</init-param>
</filter>
用于添加描述信息,该元素的内容可为空,可以不配置。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,可以不配置。
映射Filter
<!--映射过滤器-->
<filter-mapping>
<filter-name>FilterDemo02</filter-name>
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
子元素可以设置的值及其意义:
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过
RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。


浙公网安备 33010602011771号