第一节 过滤器简介
1、通过类比了解过滤器作用
①坐地铁
②登录检查
2、过滤器的三要素
①拦截
过滤器之所以能够对请求进行预处理,关键是对请求进行拦截,把请求拦截下来才能够做后续的操作。而且对于一个具体的过滤器,它必须明确它要拦截的请求,而不是所有请求都拦截。
②过滤
根据业务功能实际的需求,看看在把请求拦截到之后,需要做什么检查或什么操作,写对应的代码即可。
③放行
过滤器完成自己的任务或者是检测到当前请求符合过滤规则,那么可以将请求放行。所谓放行,就是让请求继续去访问它原本要访问的资源。
提示:将来学习SpringMVC时,会学习SpringMVC中的『拦截器』,同样具备三要素。
第二节 HelloWorld
1、思路
2、操作步骤
①准备工作
- 创建module
- 加入Thymeleaf环境
- 完成首页访问功能
- 创建Target01Servlet以及target01.html
- 创建SpecialServlet以及special.html
②创建Filter
1. public class Target01Filter implements Filter { 2. @Override 3. public void init(FilterConfig filterConfig) throws ServletException { 4. 5. } 6. 7. @Override 8. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 9. 10. // 1.打印一句话表明Filter执行了 11. System.out.println("过滤器执行:Target01Filter"); 12. 13. // 2.检查是否满足过滤条件 14. // 人为设定一个过滤条件:请求参数message是否等于monster 15. // 等于:放行 16. // 不等于:将请求跳转到另外一个页面 17. // ①获取请求参数 18. String message = request.getParameter("message"); 19. 20. // ②检查请求参数是否等于monster 21. if ("monster".equals(message)) { 22. 23. // ③执行放行 24. // FilterChain对象代表过滤器链 25. // chain.doFilter(request, response)方法效果:将请求放行到下一个Filter, 26. // 如果当前Filter已经是最后一个Filter了,那么就将请求放行到原本要访问的目标资源 27. chain.doFilter(request, response); 28. 29. }else{ 30. 31. // ④跳转页面 32. request.getRequestDispatcher("/SpecialServlet?method=toSpecialPage").forward(request, response); 33. 34. } 35. 36. } 37. 38. @Override 39. public void destroy() { 40. 41. } 42. }
[1]创建Target01Filter类
- 要点1:实现javax.servlet.Filter接口
- 要点2:在doFilter()方法中执行过滤
- 要点3:如果满足过滤条件使用 chain.doFilter(request, response);放行
- 要点4:如果不满足过滤条件转发或重定向请求
- 附带问题:Thymeleaf模板渲染。这里我们选择的解决办法是跳转到一个Servlet,由Servlet负责执行模板渲染返回页面。
[2]配置Target01Filter类
这一步也可以叫『注册』
1. <!-- 配置Target01Filter --> 2. <filter> 3. <!-- 配置Filter的友好名称 --> 4. <filter-name>Target01Filter</filter-name> 5. 6. <!-- 配置Filter的全类名,便于Servlet容器创建Filter对象 --> 7. <filter-class>com.atguigu.filter.filter.Target01Filter</filter-class> 8. </filter> 9. 10. <!-- 配置Filter要拦截的目标资源 --> 11. <filter-mapping> 12. <!-- 指定这个mapping对应的Filter名称 --> 13. <filter-name>Target01Filter</filter-name> 14. 15. <!-- 通过请求地址模式来设置要拦截的资源 --> 16. <url-pattern>/Target01Servlet</url-pattern> 17. </filter-mapping>
第三节 过滤器生命周期
1、回顾Servlet生命周期
Servlet生命周期(opens new window)
2、Filter生命周期
和Servlet生命周期类比,Filter生命周期的关键区别是:在Web应用启动时创建对象
生命周期阶段 | 执行时机 | 执行次数 |
创建对象 | Web应用启动时 | 一次 |
初始化 | 创建对象后 | 一次 |
拦截请求 | 接收到匹配的请求 | 多次 |
销毁 | Web应用卸载前 | 一次 |
第四节 过滤器匹配规则
本节要探讨的是在filter-mapping中如何将Filter同它要拦截的资源关联起来。
1、精确匹配
指定被拦截资源的完整路径:
1. <!-- 配置Filter要拦截的目标资源 --> 2. <filter-mapping> 3. <!-- 指定这个mapping对应的Filter名称 --> 4. <filter-name>Target01Filter</filter-name> 5. 6. <!-- 通过请求地址模式来设置要拦截的资源 --> 7. <url-pattern>/Target01Servlet</url-pattern> 8. </filter-mapping>
2、模糊匹配
相比较精确匹配,使用模糊匹配可以让我们创建一个Filter就能够覆盖很多目标资源,不必专门为每一个目标资源都创建Filter,提高开发效率。
①前杠后星
在我们配置了url-pattern为/user/*之后,请求地址只要是/user开头的那么就会被匹配。
1. <filter-mapping> 2. <filter-name>Target02Filter</filter-name> 3. 4. <!-- 模糊匹配:前杠后星 --> 5. <!-- 6. /user/Target02Servlet 7. /user/Target03Servlet 8. /user/Target04Servlet 9. --> 10. <url-pattern>/user/*</url-pattern> 11. </filter-mapping>
极端情况:/*匹配所有请求
②前星后缀
下面我们使用png图片来测试后缀拦截的效果,并不是只能拦截png扩展名。
[1]创建一组img标签
1. <img th:src="@{/./images/img017.png}"/><br/> 2. <img th:src="@{/./images/img018.png}"/><br/> 3. <img th:src="@{/./images/img019.png}"/><br/> 4. <img th:src="@{/./images/img020.png}"/><br/> 5. <img th:src="@{/./images/img024.png}"/><br/> 6. <img th:src="@{/./images/img025.png}"/><br/>
[2]创建Filter
1. <filter> 2. <filter-name>Target04Filter</filter-name> 3. <filter-class>com.atguigu.filter.filter.Target04Filter</filter-class> 4. </filter> 5. <filter-mapping> 6. <filter-name>Target04Filter</filter-name> 7. <url-pattern>*.png</url-pattern> 8. </filter-mapping>
③前杠后缀,星号在中间
<url-pattern>/*.png</url-pattern>
配置方式如下:
按照这个配置启动Web应用时会抛出异常:
java.lang.IllegalArgumentException: Invalid /*.png in filter mapping
结论:这么配是不允许的!
3、匹配Servlet名称[了解]
1. <filter-mapping> 2. <filter-name>Target05Filter</filter-name> 3. 4. <!-- 根据Servlet名称匹配 --> 5. <servlet-name>Target01Servlet</servlet-name> 6. </filter-mapping>
第五节 过滤器链
1、概念
- 多个Filter的拦截范围如果存在重合部分,那么这些Filter会形成Filter链。
- 浏览器请求重合部分对应的目标资源时,会依次经过Filter链中的每一个Filter。
- Filter链中每一个Filter执行的顺序是由web.xml中filter-mapping配置的顺序决定的。
2、测试
①准备工作
创建超链接访问一个普通的Servlet即可。
②创建多个Filter拦截Servlet
1. <filter-mapping> 2. <filter-name>TargetChain03Filter</filter-name> 3. <url-pattern>/Target05Servlet</url-pattern> 4. </filter-mapping> 5. <filter-mapping> 6. <filter-name>TargetChain02Filter</filter-name> 7. <url-pattern>/Target05Servlet</url-pattern> 8. </filter-mapping> 9. <filter-mapping> 10. <filter-name>TargetChain01Filter</filter-name> 11. <url-pattern>/Target05Servlet</url-pattern> 12. </filter-mapping>
控制台打印效果:
过滤器执行:Target03Filter[模糊匹配 前杠后星 /*]
测试Filter链:TargetChain03Filter
测试Filter链:TargetChain02Filter
测试Filter链:TargetChain01Filter
本章笔记是观看尚硅谷的JAVAWEB的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正