过滤器简介--操作步骤--过滤器生命周期--过滤器匹配规则-- 过滤器链

简介: 过滤器简介--操作步骤--过滤器生命周期--过滤器匹配规则-- 过滤器链


第一节 过滤器简介

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.xmlfilter-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的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正  


目录
相关文章
|
2月前
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
12天前
过滤器链加载原理
过滤器链加载原理
20 0
过滤器链加载原理
|
3月前
|
Java
SpringMVC配置字符过滤器的两种方式
SpringMVC配置字符过滤器的两种方式
41 0
|
6月前
|
存储 Python
自定义模板过滤器
自定义模板过滤器
39 1
|
XML Java 应用服务中间件
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
166 0
|
6月前
|
Java 数据安全/隐私保护
Filter概述、执行流程、拦截路径配置及过滤器链
Filter概述、执行流程、拦截路径配置及过滤器链
84 0
|
API 微服务
全局过滤器 GlobalFilter
全局过滤器 GlobalFilter
265 0
Filter过滤器概念及生命周期
Filter过滤器概念及生命周期
155 0
|
前端开发 Java 应用服务中间件
GetWay网关过滤器工厂与全局过滤器
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
353 0
|
JavaScript 开发者
过滤器-定义私有过滤器|学习笔记
快速学习过滤器-定义私有过滤器
116 0
过滤器-定义私有过滤器|学习笔记