Filter
Filter
概念
概念:Filter 表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
Servlet : 处理用户(浏览器)的请求与给用户响应的
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
过滤器一般完成一些通用的操作,比如: 权限控制、统一编码处理、敏感字符处理等等·..
快速入门
1.定义类,实现 Filter接口,并重写其所有方法(注:在Servlet4.0中,只有doFilter方法是必须public
public class FilterDemo implements Filter {
public void init(FilterConfig filterConfig)
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain)
public void destroy(){}
}
2.配置Filter拦截资源的路径:在类上定义@WebFilter注解
@WebFilter("/*")
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain){
System.out.println("filter 被执行了...");
filterChain.doFilter(request,response);
}
生命周期相关方法
Filter接口中的方法 | 作用和执行次数 |
---|---|
void init(FilterConfig filterConfig) | 初始化的方法,服务器启动执行1次 |
void doFilter(ServletRequest reques,ServletResponse response,FilterChain chain) | 过滤方法,每次请求都会执行,三个参数:1.请求对象2.响应对象3.过滤链,用于放行 |
public void destroy() |
拦截路径配置
疑问: 浏览器访问目标资源的路径,如果目标地址不存在,过滤器会不会运行?
如果请求的URL地址不存在,但是匹配过滤的地址,还是会执行过滤器
Filter可以根据需求,配置不同的拦截资源路径
@WebFilter("/*")
public class FilterDemo
拦截具体的资源: /index.jsp: 只有访问index.jsp时才会被拦截
目录拦截: /user/*: 访问/user下的所有资源,都会被拦截
后缀名拦截: *.jsp: 访问后缀名为jsp的资源,都会被拦截
拦截所有: /*:访问所有资源,都会被拦截
过滤器拦截方式
过滤类型 | 作用 |
---|---|
REQUEST | 只拦截直接的请求 |
注:一次重定向则前后相当于发起了两次请求 | |
FORWARD | 只拦截通过转发过来的请求 |
Filter 转发类型注解方式
@WebFilter注解属性 | 说明 |
---|---|
dispatcherTypes = | 拦截请求行为,默认行为 |
dispatcherTypes = | 拦截请求转发,注意:如果只配置这种方式,只会拦截请求转发,不会拦截请求 |
dispatcherlypes = | 设置采用拦截请求和请求转发两种行为 |
过滤器链
一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链
优先级按照过滤器类名(字符串) 的自然顺序