当前位置: 首页 > news >正文

第18周 3-过滤器

过滤器(Filter)概念总结

什么是过滤器

过滤器(Filter)是Java Web应用中用于统一拦截和处理请求的组件,类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理,确保请求符合特定要求。

过滤器的执行机制

  1. 当请求从浏览器发送到Tomcat时,首先会经过过滤器,而不是直接到达Servlet。
  2. 请求会依次经过各个过滤器进行处理。每个过滤器可以对请求进行检查、修改等操作。
  3. 处理完请求后,最终请求会到达Servlet进行业务逻辑处理。
  4. 响应则会按照原始路径逆向通过过滤器返回给浏览器。

过滤链

过滤器处理请求的过程称为过滤链。请求在过滤链中依次被处理,确保只有符合要求的请求才能到达Servlet。

过滤器的基本概念

  • 过滤器是用来对请求和响应进行处理的组件,可以在请求到达Servlet之前或响应返回给客户端之前进行拦截。

开发步骤

  1. 实现Filter接口

    • 任何过滤器都需要实现javax.servlet.Filter接口。
  2. 实现doFilter方法

    • doFilter方法是过滤器的核心,定义了过滤器的具体功能。
    • 方法参数包括:
      • ServletRequest request:请求对象
      • ServletResponse response:响应对象
      • FilterChain chain:过滤链,用于将请求和响应传递给下一个过滤器或目标Servlet。
  3. 配置过滤器

    • 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中可以灵活修改,无需重新编译代码。
  • 更适合全局应用过滤,在真实项目中,过滤器常用于全局性的请求处理。

使用建议

  1. 全局过滤器(如字符集过滤器):推荐使用配置形式,放在web.xml中。
  2. 局部功能或小范围设置(如Servlet):推荐使用注解形式,让开发更灵活,增强开发体验。

注解形式虽然开发体验好,但在全局性应用场景下,配置文件形式更具优势。而在局部、单一职责的场景下,注解则显得更加适合。

过滤链的概念与使用

本节我们来学习一个重要的概念——过滤链。过滤链顾名思义,就是由过滤器所形成的调用链条。在真实的项目中,过滤器往往不只有一个,当一个请求被发出后由 Tomcat 接收,再转而由 Web APP 来进行处理时,首先会经过过滤器所形成的执行链条,依次对请求进行过滤处理,最终送达到 Servlet。在 Servlet 处理后,相应的响应也会按照原始的路径反向返回给客户端。这就是过滤链的处理过程。

过滤链并不是一个复杂的概念,只是一种消息传递的机制。但是对于过滤链来说,也有一些需要考虑的细节,比如说哪个过滤器先执行,哪个过滤器后执行,以及过滤器和过滤器之间该如何设计。下面我们来看一下关于过滤链的一些开发注意事项,主要有以下三点:

开发注意事项

1. 单一职责原则

每个过滤器应该都有单独的职责。比如字符集过滤器的职责非常单一,就是进行请求和响应的字符集设置。如果在这个过滤器中额外增加关于用户身份的前置过滤,显然是不合适的。正确的做法是应该把这个额外的工作交给一个专用的用户认证过滤器来进行。在软件开发时,具体的类都要有明确的职责,不要把各种功能混在一起。这样做可以提高程序的维护性和可读性。

2. 过滤器的执行顺序

过滤器在执行过程中,执行顺序是以 filter-mapping 前后书写顺序来决定的。对于一个请求,如果被多个过滤器进行拦截,那么这些过滤器的执行顺序将以 filter-mapping 在配置文件中的前后顺序依次执行。

3. 过滤器链的传递

如果没有特殊原因,不要中断过滤链。在过滤器的 doFilter 方法最后要增加 chain.doFilter,让请求向后进行传递,最终送达给 Servlet 进行处理。如果没有调用这句话,将意味着过滤链在当前就被处理完,请求会立即返回。

监听器与过滤器的区别及实现

监听器(Listener)

  1. 概念

    • 监听器是标准 J2EE Servlet 模块下的组件,用于监控外部应用中的内置对象,如 ServletContextHttpSessionServletRequest
    • 监听器可以自动触发指定的功能代码,对 Web 对象进行监听,属于被动触发
  2. 实现与配置

    • 通过实现特定的接口(如 ServletContextListenerHttpSessionListenerServletRequestListener)来定义监听逻辑。
    • 每个接口都包含多个必须实现的方法,这些方法对应于不同对象的创建和销毁事件。
    • web.xml 文件中配置监听器时,需要添加 <listener> 标签,并指定监听器的全类名。

过滤器(Filter)

  1. 概念

    • 过滤器是 Servlet 规范中的一个组件,用于拦截客户端的请求和服务器的响应。
    • 它属于主动行为,可以对请求和响应进行预处理或后处理。
  2. 主要用途

    • 进行请求和响应的内容检查和处理。
    • 实现认证、日志记录、字符编码转换等功能。

监听器与过滤器的区别

  1. 触发机制

    • 监听器是被动触发,当特定事件(如对象的创建或销毁)发生时自动执行相应的代码。
    • 过滤器是主动行为,可以对请求和响应进行拦截和处理。
  2. 应用场景

    • 监听器适用于在对象状态改变时(如对象创建或销毁)执行特定操作。
    • 过滤器适用于对请求和响应内容进行检查和处理。
  3. 配置方式

    • 监听器需要在 web.xml 文件中配置 <listener> 标签。
    • 过滤器需要在 web.xml 文件中配置 <filter> 标签,并指定拦截的 URL 模式。

过滤器(Filter)和监听器(Listener)的区别

1. 过滤器(Filter):主动检查

过滤器就像一个门卫,每当有人进出时,它都会主动检查每个人的证件和包裹。它负责对每一次进出的请求进行拦截和处理,不管你进来做什么,它都会主动检查。

生活中的例子:

  • 门口安检:在进入一个活动场所之前,安检人员会主动检查你的背包和身份。这就是一个典型的过滤器例子。无论你是参观还是工作,每个人都要先经过安检。
  • 水过滤器:当自来水流过水过滤器时,它会主动将水中的杂质过滤掉,不管水是从哪来,最终流向哪里,只要经过水过滤器,它都会主动过滤。

编程中的应用:

  • 在每次网页请求时,过滤器可以检查用户是否登录。如果没有登录,就会将用户重定向到登录页面。
  • 它可以在用户提交数据时,检查数据是否合法(比如是否包含敏感词汇),然后再决定是否继续处理请求。

总结:过滤器总是会主动在每一次请求到达服务器之前拦截并处理,所有请求都要经过它的“检查”。

2. 监听器(Listener):被动反应

监听器就像一个在教室后面坐着的老师,他会观察学生的状态变化,比如谁进教室了、谁出去了,但他不会主动干涉每个学生的行为,只有当学生做出某些动作(比如举手提问、出教室)时,老师才会有反应。

生活中的例子:

  • 运动感应灯:当你走进房间时,感应灯会亮起。灯不会主动找你,而是等着你进入感应范围,它才会被动地亮起。
  • 火警报警器:当房间里有烟雾时,报警器会被动地响起。它平时不会主动检查每一个角落,而是等烟雾出现时才会被触发。

编程中的应用:

  • 当用户第一次访问网站时,HttpSessionListener会记录用户的会话信息。
  • 当用户退出登录时,HttpSessionListener会被触发来清理用户的会话信息。
  • 当应用启动时,ServletContextListener会被触发,用来初始化一些资源。

总结:监听器不会主动干涉每一个请求或动作,它只在某些特定事件发生时(如对象的创建、销毁)被动地反应。

3. 两者的根本区别:

  • 作用对象不同:过滤器作用于“请求和响应”的流转过程,而监听器作用于“对象的生命周期”。

    • 过滤器:对所有的请求和响应进行处理,主动决定是否放行、修改请求/响应内容。
    • 监听器:监听特定事件的发生,被动响应这些事件,如会话创建、销毁等。
  • 触发时机不同

    • 过滤器在每次请求到来时都会被主动调用处理。
    • 监听器在特定事件(如会话创建、销毁、上下文初始化等)发生时才会被动触发。

相关文章:

第18周 3-过滤器

过滤器&#xff08;Filter&#xff09;概念总结 什么是过滤器 过滤器&#xff08;Filter&#xff09;是Java Web应用中用于统一拦截和处理请求的组件&#xff0c;类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理&#xff0c;确保请求符合特定要求。 过滤器的…...

Linux之进程概念

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

小程序-使用npm包

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

【springboot】整合沙箱支付

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

技术速递|Python in Visual Studio Code 2024年9月发布

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

数据结构-3.5.队列的顺序实现

一.队列的顺序实现&#xff0c;初始化操作以及判断队列是否为空&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 ​ typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…...

preconnect 预解析

preconnect 是一种浏览器优化技术&#xff0c;用于告诉浏览器提前与指定的域名建立连接&#xff0c;包括DNS解析、TCP握手和TLS协商&#xff08;如果适用&#xff09;。这样做可以减少客户端在请求资源时所需的往返时间&#xff08;RTT&#xff09;&#xff0c;从而提高页面加载…...

Leecode热题100-283.移动零

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

如何高效使用Prompt与AI大模型对话

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

Java 之深入理解 String、StringBuilder、StringBuffer

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

vue3项目执行pnpm update后还原package.json文件后运行报错

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

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1&#xff0c;脉冲部分代码2&#xff0c;ADC部分代码![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57531a4ee76d46daa227ae0a52993191.png) 第一节 …...

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&#xff0c;创建项目 首先打开我们的Unity Hub 在我们的编译器下面新建项目&#xff0c;选择3D模板&#xff0c;更改一下我们的项目名称&#xff0c;选择一下路径&#xff0c;然后点击创建项目 等待项目创建。。。。。。 我们在项目里先创建一个plane&#xff0c;这样有点视…...

【笔记】数据结构12

文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结&#xff0c;这里记录一下。 知识点汇总 2013年408应用题41 解决方法&#xff1a; 方法一 &#xff08;1&#xff09;算法思想 算法的策略是从前向后扫描数组元素&#xff0c;标记出一个可能成为主元素的元…...

django的URL配置

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

精华帖分享 | 因子构建思考1

本文来源于量化小论坛股票量化板块精华帖&#xff0c;作者为z-coffee。 以下为精华帖正文&#xff1a; 一段时间没写帖子&#xff0c;其实一直在研究策略&#xff0c;只是从不同的角度去思考而已。熟悉我的老板其实清楚&#xff0c;我的炉子水平一般&#xff0c;基本不太依托…...

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&#xff1a;简单网络管理协议 SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种用于在计算机网络中管理网络节点&#xff08;如服务器、工作站、路由器、交换机等&#xff09;的标准协议。它属于OSI模型的应用层&#…...

ubuntu20.04系统下,c++图形库Matplot++配置

linux下安装c图形库Matplot&#xff0c;使得c可以可视化编程&#xff1b;安装Matplot之前&#xff0c;需要先安装一个gnuplot&#xff0c;因为Matplot是依赖于此库 gnuplot下载链接&#xff1a; http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过&#xff0c;下面源码…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言&#xff1a;当爬虫遭遇"地域封锁"二、背景解析&#xff1a;分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计&#xff1a;Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...