Filter 过滤器
<1> 简介
Filter 是 JavaWeb 三大组件之一 (Filter, servlet, Listener)
过滤器用于访问服务器资源时可以将一些请求拦截下来, 实现分类跳转等特殊功能.
通常用于完成通用的操作, 如: 登录验证、统一编码处理、敏感字符过滤…
<2> 基本步骤
创建过程类似于 Servlet
@WebFilter("/*")//拦截所有对象
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
filterChain.doFilter(servletRequest,servletResponse); //放行
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
<3> 配置过滤器
(1) 使用注释
@WebFilter(“过滤的内容”)
@WebFilter("/*") : 拦截全部
(2) 使用 web.xml
类似于 servlet 的 web.xml
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.demo.web.filter.Filter01</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<4> Filter 的周期
init 方法: 只在服务器启动时执行一次
doFilter 方法: 每次拦截时均执行, 可以执行多次 (每次刷新都执行)
destroy 方法: 只在服务器正常关闭时执行一次
<5> 拦截路径的配置
具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
拦截所有资源: /* 访问所有资源时,过滤器都会被执行
<6> 拦截方式的配置
(1) 使用注释
设置dispatcherTypes属性
设置dispatcherTypes属性:
REQUEST:(默认值) 浏览器直接请求资源, 转发时不拦截
FORWARD:转发访问资源
INCLUDE:包含访问资源
ERROR:错误跳转资源
ASYNC:异步访问资源
设置转发和直接访问时过滤器都会访问:
@WebFilter(value ="index.jsp",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
(2) 使用 web.xml
在 filter-mapping
下设置 dispatcher
标签, 取值为 REQUEST, FORWARD, INCLUDE, ERROR, ASYNC.
<7> 过滤器链
(1) 使用注释
当多个 Filter 作用于同一个页面时, 根据 ASCII 码逐字比较, ASCII 小的先执行
(2) 使用 web.xml
使用 web.xml 时谁的标签在上面谁先执行