Filter:过滤器
当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。 一般用于完成通用的操作,如:登陆验证、统一编码处理、敏感字符过滤等。
过滤器代码编写一般流程
- 定义一个类,实现Filter接口
- 复写方法
- 配置拦截路径
- web.xml配置
- 注解配置
过滤器的具体编写过程
- 配置web.xml
<filter> <filter-name>demo1</filter-name> <filter-class>cn.lzh.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!-- 拦截路径 --> <url-pattern>/*</url-pattern> </filter-mapping>
- 注解配置
@WebFilter("/*")
效果同上 - 过滤器的执行流程
先上代码
然后输出为@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("FilterDemo被执行了"); //放行 filterChain.doFilter(servletRequest,servletResponse); System.out.println("FilterDemo2回来了"); }
显然,Filter在放行之后,执行完所有的请求之后,还会执行放行之后的代码。 - Filter生命周期
- init,服务器启动时执行该方法,只会执行一次
- doFilter,当客户端访问服务器被拦截的资源时,就会被执行,会被执行很多次
- destory,当服务器正常关闭时,会执行该方法,也同样是执行一次
- 过滤器配置
- 拦截路径配置
- 具体资源路径:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
- 拦截目录:/user/* 访问所有jsp资源时,过滤器都会被执行
- 后缀名拦截: *.jsp 访问所有jsp资源时,过滤器都会被执行
- 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
- 拦截方式的配置(指的是资源被访问的方式:比如直接发送请求,请求转发)
-
注解配置:
- 设置dispatcherTypes属性
-
REQUEST:默认值。浏览器直接请求资源
-
FORWARD:转发访问资源
-
INCLUDE:包含访问资源
-
ERROR:错误跳转访问资源
-
ASYNC:异步访问
这个属性制定了什么类型的访问会触发过滤器,示例代码@WebFilter(value = “/*”,dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
//指定多个访问类型,用大括号括起来,用逗号分隔
-
- 设置dispatcherTypes属性
-
xml配置
<filter> <filter-name>demo1</filter-name> <filter-class>cn.lzh.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
其实就是在原来的基础上增加了一个dispatcher标签,然后在标签内写上相应的过滤类型
-
- 拦截路径配置
- 过滤器链(配置多个过滤器)
执行顺序:如果有两个过滤器,过滤器1,过滤器2
过滤器1>过滤器2>资源>过滤器2>过滤器1
过滤器的先后顺序问题:- 注解配置:按照类名的字典序来确定先后自行的循序,0比1先执行,A比B先执行
- web.xml配置:谁定义在上面谁先执行