-
过滤器的作用
在一个请求去访问某个资源的时候,filter可以在这个请求访问到这个资源之前,把请求拦下,然后做出一系列的处理或者判断(比如编码的转换,信息的过滤、权限的判断、是否已经登录的验证等等),最后filter再决定是否要让这个请求去访问那个资源.Filter在客户端和访问资源的中间位置。
Filter可以在请求访问资源之前拦截请求。
Filter可以在响应返回客户端之前拦截响应。作用:
a.可以修改response和request中的数据。
b.可以做日志输出
c.可以做事务管理
d.可以控制字符乱码
e.可以控制用户的访问权限 -
编写filter过滤器
写一个java类,然后实现javax.Servlet.Filter接口这个接口中有三个方法:init destroy doFilter
a)init:这个过滤器类被服务器创建对象的时候会调用到这个方法。
b)destroy:过滤器对象被销毁的时候会调用这个方法。
c)doFilter:当过滤器拦截到请求的时候,会调用这个doFilter.其中最重要的doFilter方法有三个参数
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
FilterChain是一个接口,表示过滤器链,这个接口中只有一个方法
public interface FilterChain { public void doFilter(ServletRequest request, ServletResponse response)throws IOException, ServletException; }
同一个请求有可能要依次的通过俩个或者多个过滤器,在web中把这样多个过滤器看做一个过滤器链条对象,就是用这个FilterChain类型的对象来表示。
chain.doFilter(req,res)表示把当前的req和res传给这个过滤器链条中的下一个过滤器进行过滤,如果说链条中已经没有下一个过滤器,那么就把这次访问放行,让它去访问它真正要访问的资源.
-
在web.xml中配置filter过滤器
注意标签中也能使用给过滤器传值
例如<filter> <filter-name>encodingFilter</filter-name> <filter-class>com.briup.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 其中<url-pattern></url-pattern>有四种配置方式
第一种 精确匹配
<url-pattern>/test_servlet</url-pattern>
表示此拦截器只会拦截/test_servlet这一个路径
第二种 扩展名匹配
<url-pattern>*.html</url-pattern>
表示此拦截器只会拦截后缀名是.html的路径
第三种 路径匹配
<url-pattern>/test/*</url-pattern>
表示此拦截器拦截/test路径下的所有资源
注意:路径和扩展名匹配无法同时设置,比如下面的三个都是非法的,如果设置,启动tomcat服务器会报错。
<url-pattern>/test/*.html</url-pattern> <url-pattern>/*.html</url-pattern> <url-pattern>he*.html</url-pattern> 另外 <url-pattern>/aa/*/bb</url-pattern> 这个是精确匹配, url必须是 /aa/*/bb,这里的*不是通配的含义
第四种 匹配任意的url
<url-pattern>/*</url-pattern>
注意:filter过滤器只是会拦截地址栏中会出现的路径, 如果是服务器内部跳转的路径,filter是不会拦截的
-
多个filter过滤器的执行顺序
如果有多个过滤器,并且多个过滤器拦截的路径有相同的部分,就有一些路径被会这多个过滤器共同拦截,那么过滤器的顺序是按照web.xml中配置的顺序从上到下执行的注意:
一个<filter>标签可以多个<filter-mapping>标签 例如: <filter> <filter-name>test_filter</filter-name> <filter-class>com.briup.web.filter.TestFilter</filter-class> </filter> <filter-mapping> <filter-name>test_filter</filter-name> <url-pattern>/hello.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>test_filter</filter-name> <url-pattern>/first.html</url-pattern> </filter-mapping>