filter过滤器主要使用于前台向后台传递数据的过滤操作。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
过滤器可以有多个称之为过滤链FilterChain,服务器会按照web.xml中过滤器定义的先后循序执行。过滤器通过chain.doFilter()决定是否继续执行。 在过滤器中,可以拦截请求,判断请求是否满足过滤规则,对满足过滤规则的请求进行修改(如,统一设置编码格式)或者决定是否继续执行下面的操作(如,判断用户是否登录)。
1、新建一个类,实现javax.serlvet.filter接口
Filter中有三个方法:
A.void init(FilterConfig config) //设置filter 的配置对象;
b.void destory() //销毁filter对象;
c.void doFilter(ServletRequestreq,ServletResponse res,FilterChain chain) //执行filter 的工作。
doFilter方法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。Filter通过调用chain.doFilter()将控制权传送给下一个过滤器,如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。当链中的最后一个过滤器调用chain.doFilter()方法时,将运行最初请求的Servlet。
2、在Web.xml中进行配置(配置和Servlet类似)
配置标签:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><filter> <filter-name>myFilter</filter-name> <!--Filter的名称--> <filter-class>***.MyFilter</filter-class> <!--Filter的包路径--> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <!--此处的Filter名称和上面的一样--> <url-pattern>/*</url-pattern> <!--指定拦截url匹配的资源--> <servlet-name>目标资源</servlet-name> <!--指定拦截指定的servlet--> <dispatcher>REQUEST</dispatcher> <!--指定过滤器所拦截的资源被 Servlet 容器调用的方式--> </filter-mapping></span>
url-pattern标签详解:
a、精确匹配,不用任何修饰符
例如:<url-pattern>/servlet/TestServlet</url-pattern>
b、扩展匹配:*.扩展名
例如:<url-pattern>*.jsp</url-pattern>
c、路径前缀匹配:目录/*
例如:<url-pattern>/servlet/*</url-pattern>
d、全部匹配:/*
例如:<url-pattern>/*</url-pattern>
Dispatcher标签详解:
指定过滤器所拦截的资源被Servlet容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多 个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
a、REQUEST:
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问或ERROR情况时,那么该过滤器就不会被调用。
b、INCLUDE:
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
c、FORWARD:
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
d、ERROR:
如若在A.jsp页面page指令中指定了error属性为examError.jsp,那么A.jsp中若出现了异常,会跳转到examError.jsp中处理。而在跳转到examError.jsp时,若过滤器配置了ERROR的dispather那么则会拦截,否则不会拦截。此功能类似error-page应用。
Filter的使用情况分为三种:
1> 通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。如,用户权限限制。
2> 通过在调用chain.doFilter方法之前,做些处理来达到某些目的。如,设置编码格式。
3> 通过在调用chain.doFilter方法之后,做些处理来达到某些目的。如,对整个web网站进行压缩。
常用Filter代码分享