第18周 3-过滤器
过滤器(Filter)概念总结
什么是过滤器
过滤器(Filter)是Java Web应用中用于统一拦截和处理请求的组件,类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理,确保请求符合特定要求。
过滤器的执行机制
- 当请求从浏览器发送到Tomcat时,首先会经过过滤器,而不是直接到达Servlet。
- 请求会依次经过各个过滤器进行处理。每个过滤器可以对请求进行检查、修改等操作。
- 处理完请求后,最终请求会到达Servlet进行业务逻辑处理。
- 响应则会按照原始路径逆向通过过滤器返回给浏览器。
过滤链
过滤器处理请求的过程称为过滤链。请求在过滤链中依次被处理,确保只有符合要求的请求才能到达Servlet。
过滤器的基本概念
- 过滤器是用来对请求和响应进行处理的组件,可以在请求到达Servlet之前或响应返回给客户端之前进行拦截。
开发步骤
-
实现Filter接口
- 任何过滤器都需要实现
javax.servlet.Filter
接口。
- 任何过滤器都需要实现
-
实现doFilter方法
doFilter
方法是过滤器的核心,定义了过滤器的具体功能。- 方法参数包括:
ServletRequest request
:请求对象ServletResponse response
:响应对象FilterChain chain
:过滤链,用于将请求和响应传递给下一个过滤器或目标Servlet。
-
配置过滤器
- 在
web.xml
文件中进行配置,定义过滤器及其作用的URI。 - 使用
<filter>
标签定义过滤器,使用<filter-mapping>
标签指定过滤器拦截的请求URI。
- 在
示例代码
- 创建项目和包结构
- 实现过滤器
FirstFilter
package com.imooc.filter;import javax.servlet.*;
import java.io.IOException;public class FirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.printf("过滤器已生效");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}
package com.imooc.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("<h1>hello servlet</h1>");}
}
过滤器的特性
- 过滤器对象在Web应用启动时被创建且全局唯一。
- 唯一的过滤器对象在并发环境中采用“单例多线程”提供服务。
过滤器的配置形式
在web.xml
中配置过滤器的基本形式如下:
<filter><filter-name>firstFilter</filter-name><filter-class>com.imooc.filter.FirstFilter</filter-class>
</filter><filter-mapping><filter-name>firstFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
配置与注解的选择总结
本节课探讨了过滤器的配置形式与注解形式各自的优劣,并提供了一些使用建议。
注解形式的优势
- 注解形式的开发体验更好,配置和源代码放在一起,减少在源代码和配置文件之间来回切换的麻烦。
- 更适合小型敏捷项目,可以快速开发和迭代。
- 更适合局部功能的设置,如特定的Servlet,因为Servlet的映射地址通常较为稳定,职责单一,注解可以让开发更灵活。
配置形式的优势
- 配置形式更适合大型系统,尤其是需要全局过滤的场景,如全局的字符集过滤器等。
- 维护性更强,配置在
web.xml
中可以灵活修改,无需重新编译代码。 - 更适合全局应用过滤,在真实项目中,过滤器常用于全局性的请求处理。
使用建议
- 全局过滤器(如字符集过滤器):推荐使用配置形式,放在
web.xml
中。 - 局部功能或小范围设置(如Servlet):推荐使用注解形式,让开发更灵活,增强开发体验。
注解形式虽然开发体验好,但在全局性应用场景下,配置文件形式更具优势。而在局部、单一职责的场景下,注解则显得更加适合。
过滤链的概念与使用
本节我们来学习一个重要的概念——过滤链。过滤链顾名思义,就是由过滤器所形成的调用链条。在真实的项目中,过滤器往往不只有一个,当一个请求被发出后由 Tomcat 接收,再转而由 Web APP 来进行处理时,首先会经过过滤器所形成的执行链条,依次对请求进行过滤处理,最终送达到 Servlet。在 Servlet 处理后,相应的响应也会按照原始的路径反向返回给客户端。这就是过滤链的处理过程。
过滤链并不是一个复杂的概念,只是一种消息传递的机制。但是对于过滤链来说,也有一些需要考虑的细节,比如说哪个过滤器先执行,哪个过滤器后执行,以及过滤器和过滤器之间该如何设计。下面我们来看一下关于过滤链的一些开发注意事项,主要有以下三点:
开发注意事项
1. 单一职责原则
每个过滤器应该都有单独的职责。比如字符集过滤器的职责非常单一,就是进行请求和响应的字符集设置。如果在这个过滤器中额外增加关于用户身份的前置过滤,显然是不合适的。正确的做法是应该把这个额外的工作交给一个专用的用户认证过滤器来进行。在软件开发时,具体的类都要有明确的职责,不要把各种功能混在一起。这样做可以提高程序的维护性和可读性。
2. 过滤器的执行顺序
过滤器在执行过程中,执行顺序是以 filter-mapping
前后书写顺序来决定的。对于一个请求,如果被多个过滤器进行拦截,那么这些过滤器的执行顺序将以 filter-mapping
在配置文件中的前后顺序依次执行。
3. 过滤器链的传递
如果没有特殊原因,不要中断过滤链。在过滤器的 doFilter
方法最后要增加 chain.doFilter
,让请求向后进行传递,最终送达给 Servlet 进行处理。如果没有调用这句话,将意味着过滤链在当前就被处理完,请求会立即返回。
监听器与过滤器的区别及实现
监听器(Listener)
-
概念:
- 监听器是标准 J2EE Servlet 模块下的组件,用于监控外部应用中的内置对象,如
ServletContext
、HttpSession
和ServletRequest
。 - 监听器可以自动触发指定的功能代码,对 Web 对象进行监听,属于被动触发。
- 监听器是标准 J2EE Servlet 模块下的组件,用于监控外部应用中的内置对象,如
-
实现与配置:
- 通过实现特定的接口(如
ServletContextListener
、HttpSessionListener
、ServletRequestListener
)来定义监听逻辑。 - 每个接口都包含多个必须实现的方法,这些方法对应于不同对象的创建和销毁事件。
- 在
web.xml
文件中配置监听器时,需要添加<listener>
标签,并指定监听器的全类名。
- 通过实现特定的接口(如
过滤器(Filter)
-
概念:
- 过滤器是 Servlet 规范中的一个组件,用于拦截客户端的请求和服务器的响应。
- 它属于主动行为,可以对请求和响应进行预处理或后处理。
-
主要用途:
- 进行请求和响应的内容检查和处理。
- 实现认证、日志记录、字符编码转换等功能。
监听器与过滤器的区别
-
触发机制:
- 监听器是被动触发,当特定事件(如对象的创建或销毁)发生时自动执行相应的代码。
- 过滤器是主动行为,可以对请求和响应进行拦截和处理。
-
应用场景:
- 监听器适用于在对象状态改变时(如对象创建或销毁)执行特定操作。
- 过滤器适用于对请求和响应内容进行检查和处理。
-
配置方式:
- 监听器需要在
web.xml
文件中配置<listener>
标签。 - 过滤器需要在
web.xml
文件中配置<filter>
标签,并指定拦截的 URL 模式。
- 监听器需要在
过滤器(Filter)和监听器(Listener)的区别
1. 过滤器(Filter):主动检查
过滤器就像一个门卫,每当有人进出时,它都会主动检查每个人的证件和包裹。它负责对每一次进出的请求进行拦截和处理,不管你进来做什么,它都会主动检查。
生活中的例子:
- 门口安检:在进入一个活动场所之前,安检人员会主动检查你的背包和身份。这就是一个典型的过滤器例子。无论你是参观还是工作,每个人都要先经过安检。
- 水过滤器:当自来水流过水过滤器时,它会主动将水中的杂质过滤掉,不管水是从哪来,最终流向哪里,只要经过水过滤器,它都会主动过滤。
编程中的应用:
- 在每次网页请求时,过滤器可以检查用户是否登录。如果没有登录,就会将用户重定向到登录页面。
- 它可以在用户提交数据时,检查数据是否合法(比如是否包含敏感词汇),然后再决定是否继续处理请求。
总结:过滤器总是会主动在每一次请求到达服务器之前拦截并处理,所有请求都要经过它的“检查”。
2. 监听器(Listener):被动反应
监听器就像一个在教室后面坐着的老师,他会观察学生的状态变化,比如谁进教室了、谁出去了,但他不会主动干涉每个学生的行为,只有当学生做出某些动作(比如举手提问、出教室)时,老师才会有反应。
生活中的例子:
- 运动感应灯:当你走进房间时,感应灯会亮起。灯不会主动找你,而是等着你进入感应范围,它才会被动地亮起。
- 火警报警器:当房间里有烟雾时,报警器会被动地响起。它平时不会主动检查每一个角落,而是等烟雾出现时才会被触发。
编程中的应用:
- 当用户第一次访问网站时,
HttpSessionListener
会记录用户的会话信息。 - 当用户退出登录时,
HttpSessionListener
会被触发来清理用户的会话信息。 - 当应用启动时,
ServletContextListener
会被触发,用来初始化一些资源。
总结:监听器不会主动干涉每一个请求或动作,它只在某些特定事件发生时(如对象的创建、销毁)被动地反应。
3. 两者的根本区别:
-
作用对象不同:过滤器作用于“请求和响应”的流转过程,而监听器作用于“对象的生命周期”。
- 过滤器:对所有的请求和响应进行处理,主动决定是否放行、修改请求/响应内容。
- 监听器:监听特定事件的发生,被动响应这些事件,如会话创建、销毁等。
-
触发时机不同:
- 过滤器在每次请求到来时都会被主动调用处理。
- 监听器在特定事件(如会话创建、销毁、上下文初始化等)发生时才会被动触发。
相关文章:
第18周 3-过滤器
过滤器(Filter)概念总结 什么是过滤器 过滤器(Filter)是Java Web应用中用于统一拦截和处理请求的组件,类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理,确保请求符合特定要求。 过滤器的…...

Linux之进程概念
作者主页: 作者主页 本篇博客专栏:Linux专栏 创作时间 :2024年9月28日 基本概念: 进程说白了其实就是一个程序的执行实例,正在执行的程序。 在内核层面来说,就是一个担当分配资源(CPU时间…...

小程序-使用npm包
目录 Vant Weapp 安装 Vant 组件库 使用 Vant 组件 定制全局主题样式 API Promise化 1. 基于回调函数的异步 API 的缺点 2. 什么是 API Promise 化 3. 实现 API Promise 化 4.调用 Promise 化之后的异步 API 小程序对 npm 的支持与限制 目前,小程序中已经…...

【springboot】整合沙箱支付
目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后,看到以下页面,下…...

技术速递|Python in Visual Studio Code 2024年9月发布
排版:Alan Wang 我们很高兴地宣布将于 2024 年 9 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展! 此版本包括以下公告: Django 单元测试支持使用 Pylance 从 inlay 提示转到定义 如果您有兴趣,可以在我们的 Pyth…...

数据结构-3.5.队列的顺序实现
一.队列的顺序实现,初始化操作以及判断队列是否为空: 1.图解: 2.代码: #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…...
preconnect 预解析
preconnect 是一种浏览器优化技术,用于告诉浏览器提前与指定的域名建立连接,包括DNS解析、TCP握手和TLS协商(如果适用)。这样做可以减少客户端在请求资源时所需的往返时间(RTT),从而提高页面加载…...

Leecode热题100-283.移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

如何高效使用Prompt与AI大模型对话
一、如何与人工智能对话 在人工智能的世界里,提示词(Prompt)就像是一把钥匙,能够解锁AI智能助手的潜力,帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙,却是一门艺术。本文将带你了解提示词的…...

Java 之深入理解 String、StringBuilder、StringBuffer
前言 由于发现 String、StringBuilder、StringBuffer 面试的时候会经常问到,这里就顺便总结一下:本文重点会以这三个字符串类的性能、线程安全、存储结构这三个方面进行分析 ✨上期回顾:Java 哈希表 ✨目录 前言 String 介绍 String 的不可变…...

vue3项目执行pnpm update后还原package.json文件后运行报错
项目场景: vue官方版本已更新到vue3.5,项目中还在使用vue3.4,因此想要更新项目vue版本。 问题描述 执行了 pnpm update 命令,一键更新了所有包,更新完成后项目不能正常运行。为了还原项目代码,先删除 nod…...

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555
蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1,脉冲部分代码2,ADC部分代码 第一节 …...
SolveigMM Video Splitter方便快捷视频分割合并软件 V3.6.1309.3-供大家学习研究参考
视频分割功能(Splitter)支持各种编码格式的AVI(DivX、DV、MJPEG、XVID、MPEG-4)、WMV、ASF(DivX、MJPEG、XVID、MPEG-4、WM Video 7/9)F、MPEG(*.mpg、*.mpeg、*.mpv、*.m2v、*.vob)文件、也支持受损的WMV、ASF格式的分割。视频合并功能(Joiner)则支持AVI、WMV/ASF、WMA、MP3、…...

Unity3D 创建一个人物,实现人物的移动
1,创建项目 首先打开我们的Unity Hub 在我们的编译器下面新建项目,选择3D模板,更改一下我们的项目名称,选择一下路径,然后点击创建项目 等待项目创建。。。。。。 我们在项目里先创建一个plane,这样有点视…...

【笔记】数据结构12
文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结,这里记录一下。 知识点汇总 2013年408应用题41 解决方法: 方法一 (1)算法思想 算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元…...

django的URL配置
1 django如何处理一个请求 首先Django要使用根URLconf模块,通过setting.py配置文件的ROOT_URLCONF来设置。 加载该模块后并查找变量 urlpatterns。这是一个Python的django.conf.urls.url()实例列表。 Django按顺序运行每个URL模式,并在匹配所请求的…...

精华帖分享 | 因子构建思考1
本文来源于量化小论坛股票量化板块精华帖,作者为z-coffee。 以下为精华帖正文: 一段时间没写帖子,其实一直在研究策略,只是从不同的角度去思考而已。熟悉我的老板其实清楚,我的炉子水平一般,基本不太依托…...
kubernetes笔记(四)
一、Pod调度策略 1.基于节点的调度 spec->nodeName [rootmaster ~]# vim myhttp.yaml --- kind: Pod apiVersion: v1 metadata:name: myhttp spec:nodeName: node-0001 # 基于节点名称进行调度containers:- name: apacheimage: myos:httpd[rootmaster ~]# kubectl a…...

通信工程学习:什么是SNMP简单网络管理协议
SNMP:简单网络管理协议 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于在计算机网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议。它属于OSI模型的应用层&#…...

ubuntu20.04系统下,c++图形库Matplot++配置
linux下安装c图形库Matplot,使得c可以可视化编程;安装Matplot之前,需要先安装一个gnuplot,因为Matplot是依赖于此库 gnuplot下载链接: http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过,下面源码…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...