过滤器的定义
过滤器,是一个服务器端的组件,用来拦截用户端的请求和相应信息,并对这些信息进行过滤。
Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能
工作原理
- 没有过滤器,用户发送请求直接到web资源
- 有过滤器,用户发送请求到过滤器,过滤后再发送到web资源,经过处理将资源响应发送到过滤器,再返回给用户
生命周期
①服务器启动的时候,web服务器创建Filter的实例对象,并调用其init方法,完成对象的初始化功能。filter对象只会创建一次,init方法也只会执行一次。
②拦截到请求时,执行doFilter方法。可以执行多次。
③服务器关闭时,web服务器销毁Filter的实例对象。
web.xml配置
子元素可以设置的值及其意义
- REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
- INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
- FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
- ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
Filter对象——FilterConfig
用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其 init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。
因此开发人员在编写filter时,通过 filterConfig对象的方法,就可获得:
①String getFilterName():得到filter的名称。
②String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
③Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
④public ServletContext getServletContext():返回Servlet上下文对象的引用。
如何实现过滤
Servlet API提供了一个Filter接口,编写的过滤器必须实现该接口。Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到过滤的目的
过滤器链——FilterChain
一个web应用中有很多个过滤器对某些web资源进行拦截,那么这组过滤器就称为过滤器链。过滤器的执行顺序和有关(谁在前先执行谁)和过滤器在web.xml文件中的配置顺序无关。
Filter开发两步走
①编写java类实现Filter接口,并实现其doFilter方法。
②在web.xml文件中对编写的filter类进行注册,并设置它所能拦截的资源。