Filter:Java web项目中的过滤器,可以过滤用户的请求,对请求进行预处理和后置处理。
? ? ? ?打个比方来说,过滤器类似于门卫大爷。如果没有门卫,邮件会直接交到收件人的手里。现在,邮件必须要先经过大爷的手,如果大爷觉得楼里有这个收件人,就先给收件人打个电话,等于预先处理一下,然后把邮件给他,如果大爷觉得没有这个人(不符合规则),或者觉得这个人平时很讨厌,就直接说,没这个收件人,赶紧拿走。收件人拿走邮件之后,大爷可能要登记一下,这就是后续操作。
?
那么,如何在项目中配置一个门卫大爷呢?一共需要两步:
1.创建过滤器执行类
? ? ? ?过滤器必须实现Filter接口,接口中有三个方法:
init() :初始化过滤器,容器初始化时执行,只执行一次
doFilter() :执行过滤器,过滤器中最重要的方法,所有的逻辑都在这里体现,这里面最重要的一行代码是chain.doFilter();表示请求向下进行
destroy():销毁过滤器,同init()一样,只会执行一次
实例:
?
class="java" name="code">public class TestFliter implements Filter { private FilterConfig config; @Override public void init(FilterConfig config) throws ServletException { this.config = config; System.out.println("初始化过滤器 "); } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { //执行前置处理 System.out.println("执行前置处理"); //执行目标请求 chain.doFilter(req, resp); System.out.println("执行后置处理"); } @Override public void destroy() { System.out.println("销毁过滤器 "); } }
?输出顺序为:
?
初始化过滤器 执行前置方法 执行后置方法 销毁过滤器
? ? 如果请求资源为doServlet,那么执行顺序为 “执行前置方法”->请求doSerlvet->“请求后置方法”
?
2.在web.xml中注册过滤器
? ? 必须在容器中注册过滤器,才能使过滤器生效
<filter> <description>测试</description> <display-name>测试</display-name> <filter-name>test</filter-name> <filter-class>framework.web.filter.TestFilter</filter-class> </filter> <filter-mapping> <filter-name>test</filter-name> <url-pattern>*</url-pattern> <dispacther>REQUEST</dispacther> <dispacther>FORWARD</dispacther> <dispacther>INCLUDE</dispacther> <dispacther>ERROR</dispacther> </filter-mapping>
?解释:
filter:定义过滤器
<description>:过滤器描述
<display-name>:显示名称
<filter-name>:过滤器名称(过滤器的唯一标志)
<filter-class>:过滤器类完整类名
?
filter-mapping:映射过滤器到指定资源上
<filter-name>:对应filter中的filter-name
<url-pattern>:资源路径,*表示全部
<dispatcher>:过滤请求类型,共有四种,一个映射中可以有多种
? ? REQUEST:直接来自浏览器的请求(默认类型)
? ? FORWARD:转发过来的请求,如在servlet中调用request.getDispatcher("路径").forward();
? ? INCLIUDE:在页面中使用include标签或在Servlet中调用request.getDispatcher("路径").include();
? ? ?ERROR:使用error-page标签发出的请求
?
多个Filter可以形成过滤器链,在web.xml中若配置了三个过滤器,顺序为a、b、c,当某个请求符合三个filter的url-pattern时,执行顺序为:
a前 -> b前 -> c前 -> 请求资源 -> c后 -> b后 -> a后
?