本系列博客汇总在这里:过滤器汇总
目录
过滤器的拦截
一、转发访问测试过滤器
我们来做个测试,写一个过滤器,指定过滤的资源为 index.jsp,然后我们在浏览器中直接访问 index.jsp,你会发现过滤器执行了!
但是,当我们在 HelloServlet 中使用服务器端的跳转 request.getRequestDispathcer(“/index.jsp”).forward(request,response);
时,就不会再执行过滤器了!也就是说,默认情况下,只能直接访问目标资源才会执行过滤器,而服务器端跳转(forward)执行目标资源,不会执行过滤器!
从上面的现象我们可以看出http://localhost:8080/filtertest/b.jsp
—— 直接访问 b.jsp 时,会执行过滤器内容;http://localhost:8080/filtertest/a.jsp
—— 访问 a.jsp(或者 servlet),但 a.jsp 会 forward 到 b.jsp,这时就不会执行过滤器!
二、四种拦截方式
1、描述
-
REQUEST
:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是 REQUEST。 -
FORWARD
:转发访问执行过滤器。包括 RequestDispatcher#forward() 方法、<jsp:forward>
标签都是转发访问。 -
INCLUDE
:包含访问执行过滤器。包括RequestDispatcher#include()方法、<jsp:include>
标签都是包含访问。 -
ERROR
:当目标资源在 web.xml 中配置为<error-page>
中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
2、使用
(1)直接访问(REQUEST)
- 在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是直接访问(REQUEST)。
(2)转发访问(FORWARD)
- 可以在
<filter-mapping>
中添加 0~n 个<dispatcher>
子元素,来说明当前访问的拦截方式。
注意:此时只拦截转发访问(FORWARD),当使用其他方式访问是不会拦截的,例如此时使用直接访问http://localhost:8080/filter_demo3/index.jsp
的方式(REQUEST),过滤器是不会执行的,如果需要拦截则需要添加配置拦截方式(REQUEST)。
(3)包含访问(INCLUDE)
配置设置拦截方式添加包含访问(INCLUDE)以后发现过滤器执行了!
(4)错误页面(ERROR)
配置设置拦截方式添加错误页面(ERROR)以后发现过滤器执行了!
其实最为常用的就是 REQUEST 和 FORWARD 两种拦截方式,而 INCLUDE 和 ERROR 都比较少用!其中 INCLUDE 比较好理解,而 ERROR 方式不易理解!
如有错误,欢迎指正!