本系列博客汇总在这里:过滤器汇总


过滤器的拦截

一、转发访问测试过滤器

我们来做个测试,写一个过滤器,指定过滤的资源为 index.jsp,然后我们在浏览器中直接访问 index.jsp,你会发现过滤器执行了!
过滤器(6)_过滤器的拦截_地址栏
但是,当我们在 HelloServlet 中使用服务器端的跳转 request.getRequestDispathcer(“/index.jsp”).forward(request,response); 时,就不会再执行过滤器了!也就是说,默认情况下,只能直接访问目标资源才会执行过滤器,而服务器端跳转(forward)执行目标资源,不会执行过滤器!
过滤器(6)_过滤器的拦截_过滤器的拦截_02
从上面的现象我们可以看出
http://localhost:8080/filtertest/b.jsp —— 直接访问 b.jsp 时,会执行过滤器内容;
http://localhost:8080/filtertest/a.jsp —— 访问 a.jsp(或者 servlet),但 a.jsp 会 forward 到 b.jsp,这时就不会执行过滤器!

二、四种拦截方式

1、描述

  1. REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是 REQUEST。
  2. FORWARD:转发访问执行过滤器。包括 RequestDispatcher#forward() 方法、<jsp:forward> 标签都是转发访问。
  3. INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、<jsp:include> 标签都是包含访问。
  4. ERROR:当目标资源在 web.xml 中配置为 <error-page> 中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。

2、使用

(1)直接访问(REQUEST)

  • 在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是直接访问(REQUEST)。

(2)转发访问(FORWARD)

  • 可以在<filter-mapping>中添加 0~n 个<dispatcher>子元素,来说明当前访问的拦截方式。
    过滤器(6)_过滤器的拦截_过滤器的拦截_03
    注意:此时只拦截转发访问(FORWARD),当使用其他方式访问是不会拦截的,例如此时使用直接访问 http://localhost:8080/filter_demo3/index.jsp的方式(REQUEST),过滤器是不会执行的,如果需要拦截则需要添加配置拦截方式(REQUEST)。
    过滤器(6)_过滤器的拦截_地址栏_04

(3)包含访问(INCLUDE)

过滤器(6)_过滤器的拦截_直接访问_05
过滤器(6)_过滤器的拦截_过滤器的拦截_06
配置设置拦截方式添加包含访问(INCLUDE)以后发现过滤器执行了!
过滤器(6)_过滤器的拦截_其他_07

(4)错误页面(ERROR)

过滤器(6)_过滤器的拦截_错误页面_08
过滤器(6)_过滤器的拦截_其他_09
配置设置拦截方式添加错误页面(ERROR)以后发现过滤器执行了!
过滤器(6)_过滤器的拦截_地址栏_10

其实最为常用的就是 REQUEST 和 FORWARD 两种拦截方式,而 INCLUDE 和 ERROR 都比较少用!其中 INCLUDE 比较好理解,而 ERROR 方式不易理解!

如有错误,欢迎指正!