Servlet 入门到精通(六)

news/2024/11/28 18:47:44/

上一篇博客的传送门:Servlet 入门到精通(五)

Servlet Filter 又称 Servlet 过滤器,它是在 Servlet 2.3 规范中定义的,是 Servlet 中的一个组件,是设计模式中责任链模式的一种经典实现。能够对 Servlet 容器传给 Web 资源的请求和响应进行校验。

过滤器的实现

过滤器和 Servlet 的实现方式比较相似,也有三种实现:

  • 实现 Filter 接口
  • 继承 GenericFilter 抽象类
  • 继承 HttpFilter 类

其中我们比较常见的就是第三种实现,它是针对于 Http 协议的一种过滤方式。

过滤器在注册时也有 XML 和注解的方式,这里我们只演示注解方式。

实现 Filter 接口

@WebFilter(value = "/*")
public class FirstFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {}public void init(FilterConfig filterConfig) throws ServletException {}
}

继承 GenericFilter 抽象类

@WebFilter(value = "/*")
public class SecondFilter extends GenericFilter {@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {}
}

继承 HttpFilter 类

@WebFilter(value = "/*")
public class ThirdFilter extends HttpFilter {@Overrideprotected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {}
}

过滤器的方法

1.init初始化方法
​ 在 web 工程启动的时候执行,此时该 Filter 对象已经创建。

2.doFilter 过滤方法
​ 只要请求资源的路径和拦截的路径相同,那么过滤器就会对请求进行过滤,这个阶段在服务器运行过程中会一直循环。其中会传递三个参数:request 对象、response对象和 filterChain 对象。前两个参数我们都了解了,那么 filterChain 是什么作用呢?它其实是对拦截进行放行的方法。

3.destroy 销毁
​ 当服务器关闭时,就会执行。

@WebFilter 注解

@WebFilter 注解可以对过滤器进行配置,容器在部署应用时,会根据其具体属性配置将相应的类部署为过滤器。

过滤器的业务流程

过滤器的流程

  1. 客户端请求访问容器内的 Web 资源。
  2. Servlet 容器接收请求,并针对本次请求分别创建一个 request 对象和 response 对象。
  3. 请求到达 Web 资源之前,先调用 Filter 的 doFilter() 方法,检查 request 对象,修改请求头和请求正文,或对请求进行预处理操作。
  4. 在 Filter 的 doFilter() 方法内,调用 FilterChain.doFilter() 方法,将请求传递给下一个过滤器或目标资源。
  5. 目标资源生成响应信息返回客户端之前,处理控制权会再次回到 Filter 的 doFilter() 方法,执行 FilterChain.doFilter() 后的语句,检查 response 对象,修改响应头和响应正文。
  6. 响应信息返回客户端。

过滤器的生命周期

过滤器的生命周期分为三个阶段:

  1. 初始化阶段
  2. 拦截和过滤阶段
  3. 销毁阶段

初始化阶段

Servlet 容器负责加载和实例化 Filter。容器启动时,读取 web.xml 或 @WebFilter 的配置信息对所有的过滤器进行加载和实例化。加载和实例化完成后,Servlet 容器调用 init() 方法初始化 Filter 实例。在 Filter 的生命周期内, init() 方法只执行一次。

拦截和过滤阶段

该阶段是过滤器生命周期中最重要的阶段。当客户端请求访问 Web 资源时,Servlet 容器会根据过滤规则进行检查。当客户端请求的 URL 与过滤器映射匹配时,容器将该请求的 request 对象、response 对象以及 FilterChain 对象以参数的形式传递给 Filter 的 doFilter() 方法,并调用该方法对请求/响应进行拦截和过滤。

销毁阶段

Filter 对象创建后会驻留在内存中,直到容器关闭或应用被移除时销毁。销毁 Filter 对象之前,容器会先调用 destory() 方法,释放过滤器占用的资源。在 Filter 的生命周期内,destory() 只执行一次。

过滤器链

过滤器的作用

过滤器的适用场景

过滤器的应用

  1. 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,也就是说可以监视,修改或以某种方式处理客户端与服务端下在交流的数据。
  2. 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
    1. 在客户端的请求访问后端资源之前,拦截这些请求。
    2. 在服务器的响应发送回客户端之前,处理这些响应。

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

相关文章

适合初学者的Python学习路线,可以帮助你快速入门并掌握Python编程基础

适合初学者的Python学习路线,可以帮助你快速入门并掌握Python编程基础 要学习python的小伙伴看过来,这是我总结的python学习路线,希望对你有所帮助 学习Python基础语法 Python的变量、数据类型、运算符等基础知识Python的条件语句、循环语句等…

测试工具之JMH详解

文章目录 1 JMH1.1 引言1.2 简介1.3 DEMO演示1.3.1 测试项目构建1.3.2 编写性能测试1.3.3 执行测试1.3.4 报告结果 1.4 注解介绍1.4.1 BenchmarkMode1.4.2 Warmup1.4.3 Measurement1.4.4 Threads1.4.5 Fork1.4.6 OutputTimeUnit1.4.7 Benchmark1.4.8 Param1.4.9 Setup1.4.10 Te…

2023年3月 青少年软件编程(Python) 等级考试试卷(五级)

一、单选题(共25题,共50分) 1.已知一个列表lst [2,3,4,5,6],lst.append(20),print(lst)的结果是?(C)(2分) A.[10,2,3,4,5,6,20] B.[20,2,10,3,4,5,6] C.[2,3,4,5,6,20] D.[2,3,4,5,…

微软对大数据分析的定义

一、什么是大数据分析 大数据分析是指用于从不同的大量、高速数据集中收集、处理和得出见解的方法、工具和应用程序。这些数据集可能来自各种来源,例如 Web、移动应用、电子邮件、社交媒体和联网智能设备。它们通常表示以高速生成、形式各样的数据,从结…

java设计模式七大原则

目录 单一职责原则 定义 单一职责原则注意事项和细节 接口隔离原则 定义 依赖倒转原则 定义 依赖倒转原则的注意事项和细节 里氏替换原则 oo中的继承性的思考和说明 介绍 迪米特法则 介绍 迪米特法则注意事项和细节 合成复用原则 介绍 设计原则核心思想 UML介…

Android事件分发机制

一、知识前瞻 用户对屏幕的操作的事件可以划分为3种最基础的事件:ACTION_DOWN、ACTION_MOVE、ACTION_UP事件分发机制分为三部分:事件生产、事件分发 、事件消费 二、事件分发 1.主要方法 dispatchTouchEvent:用于进行点击事件的分发onInte…

Kotlin 用于数据科学的基础库(深度学习、数据挖掘)

Kotlin 用于数据科学 从构建数据流水线到生产机器学习模型, Kotlin 可能是处理数据的绝佳选择: Kotlin 简洁、易读且易于学习。静态类型与空安全有助于创建可靠的、可维护的、易于故障排除的代码。作为一种 JVM 语言,Kotlin 提供了出色的性…

Vue 条件语句

文章目录 Vue 条件语句条件判断v-ifv-elsev-else-ifv-show Vue 条件语句 条件判断 v-if 条件判断使用 v-if 指令&#xff1a; v-if 指令 在元素 和 template 中使用 v-if 指令&#xff1a; <div id"app"><p v-if"seen">现在你看到我了<…