1.1 定义
过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息进行过滤。
1.2 工作原理
1、项目启动时,从 web 容器中加载过滤器;
2、过滤器存在于用户请求和 Web 资源之间;
3、用户请求和 Web 响应之间的收发都经由过滤器按照过滤规则进行过滤筛选。
1.3 过滤器的生命周期
实例化 (web.xml 加载)→初始化(init 方法)→过滤 (doFilter 方法)→销毁 (destroy 方法)
1、初始化:当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 Filter Config 对象的引用。我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的。
2、过滤:过滤器的大多数时间都消耗在这里。doFilter 方法被容器调用,同时传入分别指向这个请求 / 响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源 (通过调用 Filter Chain 对象引用上的 doFilter 方法),之后在处理控制权返回该过滤器时处理响应。
3、销毁:容器紧跟在垃圾收集之前调用 destroy() 方法,以便能够执行任何必需的清理代码。
过滤器链:服务器会按照 web.xml 中过滤器定义的先后顺序组装成一条链
1.4 过滤器在 web.xml 中的基本配置
过滤器在 web.xml 中的的配置:
- <filter>
- <filter-name>
- 过滤器名称
- </filter-name>
- <filter-class>
- 过滤器完整类名
- </filter-class>
- <init-param>
- <description>
- 描述信息,可以省略
- </description>
- <param-name>
- 参数名称
- </param-name>
- <param-value>
- 参数值
- </param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>
- 过滤器名称
- </filter-name>
- <url-pattern>
- URL
- </url-pattern>
- <dispatcher>
- [REQUEST|INCLUDE|FORWARD|ERROR]
- </dispatcher>
- </filter-mapping>
1.5 过滤器的分类
类型 | 作用 |
REQUEST | 用户直接访问页面时,web 容器会调用该过滤器 |
FORWARD | 目标资源是通过 RequestDispatcher 的 forward 方法访问时,过滤器将被调用 |
INCLUDE | 目标资源是通过 RequestDispatcher 的 include 方法调用时,过滤器将被调用 |
ERROR | 目标资源是通过声明式异常处理机制调用时,过滤器被将被调用 |
ASYNC(Servlet3.0 新增加) | 支持异步处理 |
二、过滤器的基本使用
2.1 过滤器类的设计
实现 Filter 接口,重写 init、doFilter、destroy 方法
- public class MyFilter implements Filter{
- public void init(FilterConfig filterConfig) throws ServletException{}
- /**
- *使浏览器不缓存页面的过滤器
- */
- public void doFilter(ServlerRequest request,ServletResponse response,FilterChain filterChian) throws IOException,ServletException{
- ((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
- ((HttpServletResponse) response).setHeader("Pragma","no-cache");
- ((HttpServletResponse) response).setDateHeader ("Expires", -1);
- filterChain.doFilter(request, response);//将处理任务传递给过滤器链中的下一个资源
- }
- public void destroy(){}
- }
2.2 过滤器在 web.xml 中的注册
1、REQUEST、FORWARD、INCLUDE 等类型过滤器的注册
- 过滤器配置 -->
- <filter>
- <filter-name>myFilter</filter-name>
- <filter-class>util.filter.MyFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>myFilter</filter-name>
- <url-pattern>/main.jsp</url-pattern>
- <dispatcher>[REQUEST|FORWARD|INCLUDE]</dispatcher>
- </filter-mapping>
2、ERROR 类型的过滤器注册
- 配置错误页面,当出现404错误则跳转至/error.jsp页面 -->
- <error-page>
- <error-code>404</error-code>
- <location>/error.jsp</location>
- <error-page>
- 过滤器配置 -->
- <filter>
- <filter-name>errorFilter</filter-name>
- <filter-class>util.filter.ErrorFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>errorFilter</filter-name>
- <url-pattern>/error.jsp</url-pattern>
- <dispatcher>ERROR</dispatcher>
- </filter-mapping>
三、Servlet3.0 中过滤器的使用
加上 @WebFilter 注解即可,无需在 web.xml 中注册
- @WebFilter(servletNames = {
- "SimpleServlet"
- },
- filterName = "SimpleFilter") public class MyFirstFilter implements Filter {}
来源: http://www.bubuko.com/infodetail-1986116.html