Filter:过滤器
1、概念:
- web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
- 作用:
- 一般用于完成通过的操作。如:登录验证、同一编码处理、敏感字符过滤……
2、 快速入门:
1、实现步骤:
1、创建类实现Filter接口(注意是javax.servlet.Filter)
2、重写方法
3、配置拦截路径
1、web.xml配置
<filter>
<filter-name>Demo01</filter-name> <!--取名-->
<filter-class>cn.yzx.Filter.FilterDemo01</filter-class> <!--具体路径-->
</filter>
<filter-mapping>
<filter-name>Demo01</filter-name> <!--配置的Filter的名称-->
<url-pattern>/*</url-pattern> <!--拦截路径,访问那些资源会被拦截-->
</filter-mapping>
2、注解配置(@WebFilter(“资源路径”))
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*") //配置方式一:注解配置
public class FilterDemo01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("监听器被访问了");
filterChain.doFilter(servletRequest,servletResponse); //放行
}
@Override
public void destroy() {
}
}
3、过滤器细节:
1、过滤器执行流程
step1:首先执行doFilter方法之上的代码:一般用作于增强request对象请求体的消息
step2:之后执行页面
step3:最后从doFilter方法下一行开始执行代码:一般用作与增强response对象响应体的消息
2、生命周期方法
**init:**在服务器启动时,创建Filter对象,调用init方法,只会执行一次,一般用于加载资源
**doFilter:**每一次请求被拦截时,都执行一次,会执行多次,用于书写拦截的逻辑条件代码
**destroy:**服务器关闭后,Filter对象被销毁,如果服务器是被正常关闭,会调用destroy方法,只会执行一次,一般用
于释放资源
3、配置详解
1、拦截路径的配置:
1、具体资源拦截:/xxx.jsp:只有访问指定资源时,才会被过滤
2、目录拦截:/xxx/*:访问指定目录下的资源时,会被过滤
3、后缀名拦截:*.xxx:访问指定格式的资源时,会被过滤
4、所有拦截:/*:访问所有资源都会被过滤
2、拦截方式的配置:资源被访问的方式
1、注解配置:
@WebFilter(dispatcherTypes = DispatcherType.FORWARD)
设置dispatcherTypes属性
1、REQUESR:默认值。拦截浏览器直接请求的资源
2、FORWARD:拦截转发访问的资源
3、INCLUDE:拦截包含访问的资源
4、ERROR:拦截错误跳转的资源
5、ASYNC:拦截异步访问资源
2、web.xml配置
<filter-mapping>
<filter-name>Demo01</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
设置dispatcherTypes标签
1、REQUESR:拦截浏览器直接请求的资源
2、FORWARD:拦截转发访问的资源
3、INCLUDE:拦截包含访问的资源
4、ERROR:拦截错误跳转的资源
5、ASYNC:拦截异步访问资源
4、过滤器链(配置多个过滤器)
1、执行顺序:可以配置多个过滤器,就像一条直线,请求时从上到下依次执行拦截一、拦截二、……、拦截n,响应时原路返回,依次执行拦截n、……、拦截二、拦截一,且不会从头到尾执行拦截类的代码,请求时访问到diFilter会中断,随后响应时会接着doFilter继续执行
2、过滤器优先级问题:
1、注解配置的过滤器:
按照类名,逐个字母进行比较,更小的先执行,之后停止比较,例如:aFilter和bFilter会先执行aFilter,Filter01和Filter02会先执行Filter01,因为逐个比较最后1比2小
2、web.xml配置的过滤器:
按<filter-mapping>标签的定义顺序,从上到下顺序执行