【JavaWeb】8—过滤器

news/2024/12/2 21:27:04/

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆

文章目录

  • 8 过滤器
    • 8.1 过滤器简介
      • 8.1.1 登陆检查
      • 8.1.2 过滤器三要素
        • 拦截
        • 过滤
        • 放行
    • 8.2 HelloWorld
      • 8.2.1 思路
      • 8.2.2 操作步骤
        • 准备工作
    • 8.3 过滤器生命周期
    • 8.4 过滤器匹配规则
      • 8.4.1 精准匹配
      • 8.4.2 模糊匹配
        • 前杠后星
        • 前星后缀
      • 8.4.3 匹配Servlet名称
    • 8.5 过滤器链
      • 8.5.1 概念
      • 8.5.2 测试

8 过滤器

8.1 过滤器简介

8.1.1 登陆检查

在这里插入图片描述

8.1.2 过滤器三要素

拦截

过滤器之所以能够对请求进行预处理,关键是对请求进行拦截,把请求拦截下来才能够做后续的操作。而且对于一个具体的过滤器,它必须明确它要拦截的请求,而不是所有请求都拦截。

过滤

根据业务功能实际的需求,看看在把请求拦截到之后,需要做什么检查或什么操作,写对应的代码即可。

放行

过滤器完成自己的任务或者是检测到当前请求符合过滤规则,那么可以将请求放行。所谓放行,就是让请求继续去访问它原本要访问的资源。

8.2 HelloWorld

8.2.1 思路

在这里插入图片描述

8.2.2 操作步骤

准备工作

  • 创建module
  • 加入Thymeleaf环境;
  • 完成首页访问功能;
  • 创建Target01Servlet以及target01.html
  • 创建SpecialServlet以及special.html

创建TargetFilter类:

  • 要点1:实现javax.servlet.Filter接口
  • 要点2:在doFilter()方法中执行过滤
  • 要点3:如果满足过滤条件使用 chain.doFilter(request, response);放行
  • 要点4:如果不满足过滤条件转发或重定向请求
    • 附带问题:Thymeleaf模板渲染。这里我们选择的解决办法是跳转到一个Servlet,由Servlet负责执行模板渲染返回页面。
public class Target01Filter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 1.打印一句话表明Filter执行了System.out.println("过滤器执行:Target01Filter");// 2.检查是否满足过滤条件// 人为设定一个过滤条件:请求参数message是否等于monster// 等于:放行// 不等于:将请求跳转到另外一个页面// ①获取请求参数String message = request.getParameter("message");// ②检查请求参数是否等于monsterif ("monster".equals(message)) {// ③执行放行// FilterChain对象代表过滤器链// chain.doFilter(request, response)方法效果:将请求放行到下一个Filter,// 如果当前Filter已经是最后一个Filter了,那么就将请求放行到原本要访问的目标资源chain.doFilter(request, response);}else{// ④跳转页面request.getRequestDispatcher("/SpecialServlet?method=toSpecialPage").forward(request, response);}}@Overridepublic void destroy() {}
}

配置TargetFilter类:

<!-- 配置Target01Filter -->
<filter><!-- 配置Filter的名称 --><filter-name>Target01Filter</filter-name><!-- 配置Filter的全类名,便于Servlet容器创建Filter对象 --><filter-class>com.atguigu.filter.filter.Target01Filter</filter-class>
</filter><!-- 配置Filter要拦截的目标资源 -->
<filter-mapping><!-- 指定这个mapping对应的Filter名称 --><filter-name>Target01Filter</filter-name><!-- 通过请求地址模式来设置要拦截的资源 --><url-pattern>/Target01Servlet</url-pattern>
</filter-mapping>

8.3 过滤器生命周期

和Servlet生命周期类比,Filter生命周期的关键区别是:在Web应用启动时创建对象

生命周期阶段执行时机执行次数
创建对象Web应用启动时一次
初始化创建对象后一次
拦截请求接收到匹配的请求多次
销毁Web应用卸载前一次

8.4 过滤器匹配规则

8.4.1 精准匹配

指定被拦截资源的完整路径:

<!-- 配置Filter要拦截的目标资源 -->
<filter-mapping><!-- 指定这个mapping对应的Filter名称 --><filter-name>Target01Filter</filter-name><!-- 通过请求地址模式来设置要拦截的资源 --><url-pattern>/Target01Servlet</url-pattern>
</filter-mapping>

8.4.2 模糊匹配

相比较精确匹配,使用模糊匹配可以让我们创建一个Filter就能够覆盖很多目标资源,不必专门为每一个目标资源都创建Filter,提高开发效率。

前杠后星

在我们配置了url-pattern/user/*之后,请求地址只要是/user开头的那么就会被匹配。

<filter-mapping><filter-name>Target02Filter</filter-name><!-- 模糊匹配:前杠后星 --><!--/user/Target02Servlet/user/Target03Servlet/user/Target04Servlet--><url-pattern>/user/*</url-pattern>
</filter-mapping>

极端情况:/*匹配所有请求

前星后缀

<filter><filter-name>Target04Filter</filter-name><filter-class>com.atguigu.filter.filter.Target04Filter</filter-class>
</filter>
<filter-mapping><filter-name>Target04Filter</filter-name><url-pattern>*.png</url-pattern>
</filter-mapping>

8.4.3 匹配Servlet名称

<filter-mapping><filter-name>Target05Filter</filter-name><!-- 根据Servlet名称匹配 --><servlet-name>Target01Servlet</servlet-name>
</filter-mapping>

8.5 过滤器链

8.5.1 概念

  • 多个Filter的拦截范围如果存在重合部分,那么这些Filter会形成Filter链
  • 浏览器请求重合部分对应的目标资源时,会依次经过Filter链中的每一个Filter;
  • Filter链中每一个Filter执行的顺序是由web.xml中filter-mapping配置的顺序决定的;

在这里插入图片描述

8.5.2 测试

<filter-mapping><filter-name>TargetChain03Filter</filter-name><url-pattern>/Target05Servlet</url-pattern>
</filter-mapping>
<filter-mapping><filter-name>TargetChain02Filter</filter-name><url-pattern>/Target05Servlet</url-pattern>
</filter-mapping>
<filter-mapping><filter-name>TargetChain01Filter</filter-name><url-pattern>/Target05Servlet</url-pattern>
</filter-mapping>

先执行TargetChain03Filter,然后执行TargetChain02Filter,最后执行TargetChain01Filter。


http://www.ppmy.cn/news/38894.html

相关文章

ChatGPT 的平替 Claude 使用指南

Claude的独立体验版本姗姗来迟&#xff0c;经过近半个月的等待后&#xff0c;收到了体验邮件&#xff0c;不过之前早已体验过poe和slack的集成版&#xff0c;响应速度上要比ChatGPT快很多。目前提供的Model有&#xff1a;"claude-v1"&#xff1a;我们最大的型号&…

Dubbo负载均衡策略

文章目录Dubbo负载均衡策略Dubbo负载均衡策略操作步骤1. 环境准备2. 配置提供者3. 编写服务提供者接口与实现类4. 配置消费者5. 编写服务消费者代码6. 运行项目7. 扩展Dubbo负载均衡策略8. 配置扩展负载均衡策略9. 运行项目Dubbo负载均衡策略 在Dubbo中&#xff0c;负载均衡是…

STM-32:TIM输出比较—PWM驱动LED呼吸灯/PWM驱动舵机/PWM驱动直流电机

目录一、输出比较二、PWM三、定时器结构3.1输出比较通道&#xff08;通用&#xff09;3.2输出比较通道&#xff08;高级&#xff09;3.3输出模式控制器模式3.4PWM基本结构3.5PWM参数值计算四、外设4.1舵机4.2直流电机五、程序代码5.1PWM驱动LED呼吸灯5.2PWM驱动舵机5.3PWM驱动直…

学会吊打面试官之underedmap

小白&#xff1a;大牛你好&#xff01;我最近学习了STL容器&#xff0c;看到有个叫做unordered_map的容器&#xff0c;这是什么&#xff1f; 大牛&#xff1a;unordered_map是一个无序的关联式容器&#xff0c;也就是一种键值对的存储结构&#xff0c;其中的元素没有固定的顺序…

[linux kernel]slub内存管理分析(0) 导读

文章目录简介整体目录SLUB中的结构体关系图kmalloc 申请逻辑逻辑图逻辑简述kfree 释放逻辑逻辑图逻辑简述slab page状态转换关系图简介 linux 内核内存管理算法有管理页面分配的伙伴算法&#xff0c;和对于小块内存的slab、slob、slub算法。其中slab是slob和slub的基础&#x…

开心档之开发入门网-C++ 有用的资源

C 有用的资源 目录 C 有用的资源 C 有用的网站 C 有用的书籍 以下资源包含了 C 有关的网站、书籍和文章。请使用它们来进一步学习 C 的知识。 C 有用的网站 C Standard Library headers − C 标准库。C Programming − 这本书涵盖了 C 语言编程、软件交互设计、C 语言的现…

CMake入门教程【基础篇】4.target_include_directories包含指定文件夹头文件

target_include_directories包含指定文件夹头文件 文章目录 知识点实例代码目录代码实现编译知识点 target_include_directories() 指定目标包含的头文件路径 实例 代码目录 |-📁prj3   |-- 🎴CMakeLists.txt   |-📁include    |-- 📄Hello.h   |-📁src…

java面试准备17

事务的四大特性 &#xff08;1&#xff09;原子性&#xff1a;事务执行的最小单位&#xff0c;不可被分割&#xff0c;事务的原子性保证事务中的一连串动作要么都执行&#xff0c;要么都不执行。 &#xff08;2&#xff09;一致性&#xff1a;执行事务前后的数据保持一致&…