概念:Fileter过滤器,是JavaWeb三大组件(Servlet Filter Listener)之一
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
过滤器一般完成一些通用的操作,比如:登录校验,统一编码处理,敏感字符处理等
实现 :
-
-
- 定义Filter : 定义一个类 , 实现 Filter 接口 ,并重写其所有方法
- 配置Filter : Filter 类上加 @WebFilter 注解 , 配置拦截资源的路径 . 引导类上 加@ServletComponentScan 开启Servlet 组件支持
-
Filter 接口:
重写3个方法:
init方法 : 初始化方法,只能被执行一次
doFilter方法 : 每次拦截请到请求,都会执行,可以执行多次(该方法必须重写 )
destroy方法 : 销毁方法,只能被执行一次
放行:
调用doFilter方法中的chain对象的doFilter方法(形参为请求头和请求体)可以将指定请求放行
@WebFilter public class TestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化方法,只执行一次"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse , FilterChain filterChain) throws IOException, ServletException { System.out.println("拦截方法,每次请求时都会执行"); //放行 形参 : 请求对象 和 响应对象 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { System.out.println("销毁方法,服务器关闭时调用只执行一次"); } }
注意事项:
@WebFilter的 value属性和urlPatterns属性是完全等价的
@WebFilter("/*|)代表拦截所有请求
在启动类上添加@ServletComponentScan注释(作用: 开启servlet组件)
Filter 类上加 @WebFilter 注解
导包是导的servlet包下的
执行流程:
放行后,开始访问Web资源,得到响应再回到doFile,
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("拦截方法,每次请求时都会执行 ------放行前逻辑"); //放行 形参 : 请求对象 和 响应对象 filterChain.doFilter(servletRequest, servletResponse); System.out.println("拦截方法,每次请求时都会执行 ------放行后逻辑"); }
Filter拦截路径
Filter 可以根据需求,配置不同的拦截资源路径
拦截路径 | urlPatterns | 含义 |
拦截具体路径 | /login | 只有访问/login路径时,才会被拦截 |
目录拦截 | /emps/* | 访问/emps下的所有资源,都会被拦截 |
拦截所有 | /* | 访问所有资源,都会被拦截 |
过滤器链:
一个web应用中,配置了多个过滤器,就形成了一个过滤器链
注意事项:
过滤器的顺序: 优先级是按照过滤类名(字符串)的自然排序(Ascll码)