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

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...