当前位置: 首页 > 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;下面源码…...

[激光原理与应用-126]:南京科耐激光-激光焊接 - 焊中无损检测技术 - 智能制程监测系统IPM介绍 - 26- 频域分析法

目录 一、什么是频域分析法 1、定义 2、基本原理 3、分析步骤 4、应用领域 5、优缺点 二、频域分析法在激光焊接故障监测中的应用 2.1 概述 1、应用背景 2、频域分析法的应用 3、应用优势 4、应用实例 2.2 激光焊接故障检测中光电信号的频谱特征 1、光电信号分类…...

深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践

1. 什么是修饰符&#xff08;Modifier&#xff09;&#xff1f; 1.1 修饰符的定义 在 Solidity 中&#xff0c;修饰符&#xff08;Modifier&#xff09;是一种用于更改函数行为的关键字。它们可以用于控制函数的执行条件、添加前置检查、简化重复逻辑等。修饰符在函数执行之前…...

YOLO11项目实战1:道路缺陷检测系统设计【Python源码+数据集+运行演示】

一、项目背景 随着城市化进程的加速和交通网络的不断扩展&#xff0c;道路维护成为城市管理中的一个重要环节。道路缺陷&#xff08;如裂缝、坑洞、路面破损等&#xff09;不仅影响行车安全&#xff0c;还会增加车辆的磨损和维修成本。传统的道路缺陷检测方法主要依赖人工巡检…...

怎么屏蔽统计系统统计到的虚假ip

屏蔽统计系统中的虚假IP是保护网站分析数据准确性的重要措施。以下是一些有效的策略和步骤&#xff0c;可以帮助您过滤掉虚假IP&#xff1a; 1. 识别虚假IP的特征 了解虚假IP的常见特征可以帮助您识别和屏蔽它们&#xff1a; 短时间内高频率访问&#xff1a;虚假IP可能会在短…...

前端开发设计模式——策略模式

目录 一、策略模式的定义和特点 1.定义&#xff1a; 2.特点&#xff1a; 二、策略模式的实现方式 1.定义策略接口&#xff1a; 2.创建具体策略类&#xff1a; 3.定义上下文类&#xff1a; 三、策略模式的应用场景 1.表单验证场景&#xff1a; 2.动画效果切换场景&…...

SysML案例-潜艇

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>...

车辆重识别(2020NIPS去噪扩散概率模型)论文阅读2024/9/27

[2] Denoising Diffusion Probabilistic Models 作者&#xff1a;Jonathan Ho Ajay Jain Pieter Abbeel 单位&#xff1a;加州大学伯克利分校 摘要&#xff1a; 我们提出了高质量的图像合成结果使用扩散概率模型&#xff0c;一类潜变量模型从非平衡热力学的考虑启发。我们的最…...

基于深度学习的任务序列中的快速适应

基于深度学习的任务序列中的快速适应是指模型在接连处理不同任务时&#xff0c;能够迅速调整和优化自身以适应新任务的能力。这种能力在动态环境和多任务学习中尤为重要&#xff0c;旨在减少训练时间和资源需求。以下是这一主题的关键要素&#xff1a; 1. 快速适应的背景 动态…...

虚拟机三种网络模式详解

在电脑里开一台虚拟机&#xff0c;是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏&#xff0c;还是用来学习Linux、跑跑应用程序都是很好的。而这其中&#xff0c;虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常见的虚拟网络提供的三种网络链接模…...

[leetcode]674_最长连续递增序列

给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 l < i < r&#xff0c;都有 nums[i] < nums[i 1] &am…...

广州黄埔区网站建设/安卓系统优化大师

安装&#xff0f;升级你的Docker客户端 推荐安装1.10.0以上版本的Docker客户端。 您可以通过阿里云的镜像仓库下载&#xff1a;docker-engine、docker-ce 或执行以下命令&#xff1a; curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/interne…...

需要郑州网站建设/杭州百度推广代理公司哪家好

美好的东西有时说没就没了。本来想有机会和对象亲自去欧洲转一转&#xff0c;看看竞技场&#xff0c;看看凯旋门&#xff0c;看看埃菲尔铁塔&#xff0c;看看巴黎圣母院。然而今天&#xff0c; 巴黎圣母院经历了一场大火&#xff0c;着实让人惋惜 。上一次有这种感受&#xff0…...

贵阳地铁建设网站/制作网站推广

局域网部署Docker--从无到有创建自己的Docker私有仓库 http://lib.csdn.net/base/docker 正在刷(学习)一遍官方文档&#xff0c;上面是一些其他可能用到的资料&#xff0c;是在解决自己遇到问题的时候搜到的&#xff0c;先放这里。继续先刷文档。。。转载于:https://www.cnblog…...

windows做的ppt下载网站/公司网站怎么弄

2019独角兽企业重金招聘Python工程师标准>>> 已有 9450 次阅读 2012-3-15 20:50 |系统分类:科研笔记|关键词:opencv 轮廓 轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match) 作者&#xff1a;王先荣 前…...

免费做网站的好不好/白酒最有效的推广方式

1.Task的分配 假设一个topology有4个worker&#xff0c;2个spout&#xff0c;2个bolt。spout1有4个task&#xff0c;spout2有2个task&#xff0c;bolt1有4个task&#xff0c;bolt2有4个task。&#xff08;默认一个task对应一个Executor&#xff09; storm会为每个task顺次分配t…...

微信营销微网站建设/推广怎么推

kubernetes ceph-csi分析目录导航 概述 kube-controller-manager组件中&#xff0c;有两个controller与存储相关&#xff0c;分别是PV controller与AD controller。 基于tag v1.17.4 https://github.com/kubernetes/kubernetes/releases/tag/v1.17.4 PV Cotroller分析 这…...