Servlet 入门到精通(六)

news2024/11/17 23:37:07

上一篇博客的传送门: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 {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) 
            throws IOException, ServletException {
        
    }
}

继承 HttpFilter 类

@WebFilter(value = "/*")
public class ThirdFilter extends HttpFilter {
    @Override
    protected 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.coloradmin.cn/o/451810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot启动自动执行sql脚本

在开发当中我们每次发布服务都需要手动执行脚本,然后重启服务,而SpringBoot有服务启动自动执行sql脚本的功能的,可以为我们省去手动执行脚本的这一步,只需要部署新的服务即可。 这个功能是SpringBoot自带的不需要引入额外的依赖&a…

Spring Boot 提取内存密码

访问 /actuator/heapdump 下载内存,提取密码 select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))

学习系统编程No.21【进程间通信之共享内存】

引言: 北京时间:2023/4/16/21:53,刚刚把新文章发出去,开完班会回来,本来上篇博客在昨天就能发的,昨天下午打了一下午的羽毛球之后,饭都没吃,躺在床上,准备睡觉&#xff…

Spring五大类注解 || Bean的更简单存储

目录 前言: 五大类注解 Controller Service Repository Component Configuration JavaEE标准分层 阿里分层结构 BeanName命名规则 方法注解 Bean 注入方式取Bean 属性注入 Setter注入 构造方法注入 Resource 前言: 使用Spring容器&…

Linux-驱动开发-基础温习

一、裸机开发和驱动开发的区别: 裸机开发:底层(相对于linux来说),库 二、linux驱动开发-根据各种框架进行开发 1、 外设比较多,资源多,资料非常少,官方的SDK;直接操作寄存器不显示…

Python 基础(十):元组

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 文章目录 一、声明元组二、访问元组三、修改元组变量四、遍历元组五、切片六、常用函数和方法6.…

SpringBoot实现导出Excel功能

1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现,前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的,不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。 3 实现思路 后端查询…

103. 二叉树的锯齿形层序遍历【191】

难度等级:中等 上一篇算法: 104. 二叉树的最大深度【75】 力扣此题地址: 103. 二叉树的锯齿形层序遍历 - 力扣(Leetcode) 1.题目:103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其…

p65 内网安全-域环境工作组局域网探针方案

数据来源 基本概念 DMZ区域:称为“隔离区”,也称‘’非军事化区/停火区” 工作组(Work Group)是局域网中的一个概念。它是最常见最简单最普通的资源管理模式,就是将不同的电脑按功能分别列入不同的组中,以…

完美解决丨except NameError:

示例如下: try: print(xx) except: print(xx is not defined) print(continue) 解决办法 第一种解决办法: try: print(xx) except NameError: print(xx is not defined) print(continue) 第二种解决办法: print(xx) if xx in locals() e…

camunda工作流user task如何使用

在Camunda中使用User Task通常需要以下步骤: 1、创建User Task:使用BPMN 2.0图形化设计器(如Camunda Modeler),将User Task元素拖到流程图中,并为任务命名,指定参与者(用户或用户组…

第二章 Maven 核心程序解压和配置

第一节 Maven核心程序解压与配置 1、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 下载链接: 具体下载地址:https://dlcdn.apac…

算法:(力扣)(牛客)打印螺旋矩阵题

手撕螺旋矩阵 题目思路解题 题目 描述:给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。数据范围:0 \le n,m \le 100≤n,m≤10,矩阵中任意元素都满足 |val| \le 100∣val…

makefile 规则的覆盖

makefile 中经常会使用规则的覆盖,同样一个target 可能有多个prerequisites,这种依赖关系可以放到一起,也可以分开指定。 例1: test1:echo "test111"test2:echo "test222"test3:echo "test333"he…

vsync-app 不稳定导致抖动

问题描述:跟对比机器对比uc 浏览器新闻页滑动场景,出现抖动 1、trace 看是没有丢帧,对比看送帧buffer 给到 SF 步调不够一致,从间隔较大的两个 送帧buffer看,发现vsync-app 时间比正常的要长3ms 左右,vsync…

网络交换机端口管理工具

如今,企业或组织级网络使用数百个交换机端口作为其 IT 基础架构的一部分来实现网络连接。这使得交换机端口管理成为日常网络管理任务的一部分。传统上,网络管理员必须依靠手动网络交换机端口管理技术来跟踪交换机及其端口连接状态。这种手动任务弊大于利…

基于斯坦福大学开源,从零搭建chatGPT

下载地址: https://huggingface.co/datasets/togethercomputer/RedPajama-Data-1T 预处理仓库:https://github.com/togethercomputer/RedPajama-Data 复刻ChatGPT!斯坦福等开启红睡衣计划,开源1.2万亿token训练集 【新智元导读…

JAVA队列(Queue)用法附实例讲解

队列是什么 队列用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素 …

【JavaWeb】Servlet(崔老师版)

文章目录 1.概述1.1 JavaWeb三大组件1.2 Servlet作用 2.ServletConfig接口3.Servlet接口3.1 实现Servlet的方式3.2 Servlet生命周期 4.HttpServlet抽象类6.ServletContext5.1 概述5.2 获取ServletContext5.3 JavaWeb四大域对象5.4 获取应用初始化参数5.5 ServletContext获取资源…

【UML建模】时序图(Sequence Diagram)

文章目录 1.概述2.时序图的组成元素2.1.角色(Actor)2.2.实体和对象2.3.生命周期线(Lifeline)2.3.1.激活(Activation)2.3.2.消息(Messages)2.3.3.组合片段(Fragments&…