JavaWeb之过滤器
1. 过滤器的概念
过滤器是Java Servlet规范中定义的组件,用于在请求到达Servlet之前或响应返回客户端之前,对请求或响应进行拦截和处理。过滤器可以实现以下功能:
- 日志记录:记录请求的详细信息,如URI、参数、时间等。
- 身份验证和授权:检查用户是否已登录,是否有权限访问资源。
- 输入输出编码处理:处理请求和响应的字符编码,防止乱码。
- 请求和响应的修改:可以对请求参数或响应内容进行修改。
2. 过滤器的工作原理
过滤器通过拦截器链(Filter Chain)来工作。当客户端发送请求时,Servlet容器根据配置将请求交给符合条件的过滤器。过滤器可以选择对请求进行处理,然后通过FilterChain
将请求传递给下一个过滤器或目标资源。响应返回时,过滤器也有机会对响应进行处理。
3. 过滤器的生命周期
过滤器的生命周期由Servlet容器管理,主要包括以下方法:
init(FilterConfig filterConfig)
:在过滤器被创建时调用,进行初始化操作。doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
:每次拦截请求时调用,包含过滤逻辑。destroy()
:在过滤器被销毁前调用,用于释放资源。
4. 实现过滤器接口
要创建一个过滤器,需要实现javax.servlet.Filter
接口,并重写上述三个方法。示例:
public class LoggingFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {// 初始化操作}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 过滤逻辑chain.doFilter(request, response); // 放行请求}public void destroy() {// 资源释放操作}
}
注意导包不要导错了,不然没有doFilter方法的!!!
5. 过滤器的配置
过滤器可以通过两种方式进行配置:
5.1 在web.xml
中配置
<filter><filter-name>LoggingFilter</filter-name><filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping><filter-name>LoggingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
5.2 使用注解配置
@WebFilter(urlPatterns = "/*", filterName = "LoggingFilter")
public class LoggingFilter implements Filter {// 实现方法
}
6. doFilter
方法详解
doFilter
方法是过滤器的核心,它包含了对请求和响应的处理逻辑。
-
参数说明:
ServletRequest request
:请求对象。ServletResponse response
:响应对象。FilterChain chain
:过滤器链,用于将请求传递给下一个过滤器或目标资源。
-
放行请求:通过调用
chain.doFilter(request, response)
,将请求传递给下一个过滤器或目标资源。 -
处理顺序:在
chain.doFilter()
之前的代码会在请求到达目标资源之前执行;chain.doFilter()
之后的代码会在目标资源处理完毕、响应返回之前执行。
7. 过滤器链和过滤器的顺序
-
过滤器链:多个过滤器可以组成一个链条,按照配置的顺序依次执行。
-
执行顺序:在
web.xml
中,过滤器的执行顺序由<filter-mapping>
的配置顺序决定。先配置的先执行。 -
示例:
<filter-mapping><filter-name>AuthFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping><filter-name>LoggingFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>
在上述配置中,
AuthFilter
会先于LoggingFilter
执行。
当请求到达时,过滤器链的执行顺序如下:
- 第一个过滤器的
doFilter
方法被调用。 - 该过滤器在完成前处理后,调用
chain.doFilter(request, response)
将请求和响应传递给下一个过滤器。 - 如果还有更多过滤器,它们的
doFilter
方法将依次被调用,直到链的最后一个过滤器。 - 最后,目标资源(如 servlet)处理请求并生成响应。
- 响应返回时,过滤器将依次完成后处理,直到第一个过滤器的
doFilter
方法结束。(像栈一样,先进后处理完成)
代码实操:
设置三个过滤器,看TomCat控制台的输出即可得到其顺序
servlet1:
package com.Gege.filters;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;
@WebFilter("/*")
public class filter1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filter1 before doFilter invoked");filterChain.doFilter(servletRequest,servletResponse);System.out.println("filter1 after doFilter invoked");}@Overridepublic void destroy() {Filter.super.destroy();}
}
servlet2:
package com.Gege.filters;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;
@WebFilter("/*")
public class filter2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filter2 before doFilter invoked");filterChain.doFilter(servletRequest,servletResponse);System.out.println("filter2 after doFilter invoked");}@Overridepublic void destroy() {Filter.super.destroy();}
}
servlet3:
package com.Gege.filters;import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;import java.io.IOException;
@WebFilter("/*")
public class filter3 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filter3 before doFilter invoked");filterChain.doFilter(servletRequest,servletResponse);System.out.println("filter3 after doFilter invoked");}@Overridepublic void destroy() {Filter.super.destroy();}
}
XML的配置:
<filter><filter-name>filter1</filter-name><filter-class>com.Gege.filters.filter1</filter-class></filter><filter-mapping><filter-name>filter1</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping><filter><filter-name>filter2</filter-name><filter-class>com.Gege.filters.filter2</filter-class></filter><filter-mapping><filter-name>filter2</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping><filter><filter-name>filter3</filter-name><filter-class>com.Gege.filters.filter3</filter-class></filter><filter-mapping><filter-name>filter3</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping>
执行顺序1->2->3
输出顺序3->2->1
8. 过滤器的应用场景
-
安全控制:验证用户身份,检查权限,防止未授权的访问。
-
日志记录:记录请求和响应的信息,便于调试和审计。
-
数据压缩:对响应内容进行压缩,提高传输效率。
-
字符编码处理:统一处理请 求和响应的字符编码,防止乱码。
-
敏感词过滤:过滤请求参数或响应内容中的敏感词汇
9. 过滤器的URL匹配和过滤范围
-
url-pattern
的配置:决定了过滤器应用于哪些请求。-
/*
:匹配所有请求。 -
/servlet/*
:匹配以/servlet/
开头的请求。 -
*.jsp
:匹配所有以.jsp
结尾的请求。
-
-
排除特定路径:如果需要排除某些路径,可以在过滤器中添加条件判断,或者在配置中精确指定需要过滤的路径。
13. 示例代码
以下是一个完整的过滤器示例,实现了请求日志记录功能:
@WebFilter(urlPatterns = "/*", filterName = "LoggingFilter")
public class LoggingFilter implements Filter {private SimpleDateFormat dateFormat;public void init(FilterConfig filterConfig) throws ServletException {dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {// 转换为HttpServletRequest,因为要用子类的方法HttpServletRequest request = (HttpServletRequest) req;String requestURI = request.getRequestURI();String dateTime = dateFormat.format(new Date());long t1 = System.currentTimeMillis();// 请求到达目标资源之前的处理System.out.println(requestURI + " 在 " + dateTime + " 被访问了");// 放行请求chain.doFilter(req, resp);// 请求处理完毕后的处理long t2 = System.currentTimeMillis();System.out.println(requestURI + " 资源在 " + dateTime + " 的请求耗时:" + (t2 - t1) + " 毫秒");}public void destroy() {// 资源释放}
}
FilterConfig 对象
FilterConfig
是过滤器的配置对象,提供以下方法:
getFilterName()
:获取过滤器的名称。getInitParameter(String name)
:获取初始化参数的值。getInitParameters()
:获取所有初始化参数的值。getServletContext()
:获取ServletContext
对象,允许访问应用程序的上下文信息。
示例代码
这个过滤器将在初始化时读取一个配置参数,并在处理请求时打印过滤器的名称和上下文路径。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class MyFilter implements Filter {private String filterName;private String initParamValue;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 获取过滤器的名称filterName = filterConfig.getFilterName();// 获取初始化参数initParamValue = filterConfig.getInitParameter("myParam");// 获取 ServletContext 对象ServletContext context = filterConfig.getServletContext();String contextPath = context.getContextPath();System.out.println("Filter Name: " + filterName);System.out.println("Context Path: " + contextPath);System.out.println("Initialization Parameter (myParam): " + initParamValue);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 在请求到达目标资源之前的处理System.out.println("Request received in filter: " + filterName);// 放行请求chain.doFilter(request, response);// 在响应返回客户端之前的处理System.out.println("Response processed in filter: " + filterName);}@Overridepublic void destroy() {// 清理资源System.out.println("Destroying filter: " + filterName);}
}
web.xml 配置
为了使用初始化参数,需要在 web.xml
中定义过滤器和参数:
<filter><filter-name>MyFilter</filter-name><filter-class>com.example.MyFilter</filter-class><init-param><param-name>myParam</param-name><param-value>HelloFilter</param-value></init-param>
</filter>
<filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
说明
-
init
方法:- 使用
filterConfig.getFilterName()
获取过滤器的名称,并存储在filterName
变量中。 - 使用
filterConfig.getInitParameter("myParam")
获取名为myParam
的初始化参数的值。 - 使用
filterConfig.getServletContext()
获取ServletContext
对象,并获取上下文路径。
- 使用
-
doFilter
方法:- 在请求到达目标资源之前和响应返回之前,打印过滤器的名称。
-
destroy
方法:- 在过滤器被销毁时打印信息。
FilterChain 对象
FilterChain
是过滤器链对象,允许过滤器将请求和响应传递给下一个过滤器或目标资源。主要方法:
doFilter(ServletRequest request, ServletResponse response)
:将请求和响应传递给下一个过滤器或目标资源。如果这是最后一个过滤器,则目标资源会被调用。
推荐更多好文:
JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)_webfilter-CSDN博客
相关文章:
JavaWeb之过滤器
1. 过滤器的概念 过滤器是Java Servlet规范中定义的组件,用于在请求到达Servlet之前或响应返回客户端之前,对请求或响应进行拦截和处理。过滤器可以实现以下功能: 日志记录:记录请求的详细信息,如URI、参数、时间等。…...
学习 笔记
bin log/redo log/undo log MySQL日志主要包括查询日志、慢查询日志、事务日志、错误日志、二进制日志等。其中比较重要的是 bin log(二进制日志)和 redo log(重做日志)和 undo log(回滚日志)。 慢SQL查询&…...
Flask-1
文章目录 Flask准备创建flask项目flask加载项目配置的二种方式 路由的基本定义接收任意路由参数接收限定类型参数自定义路由参数转换器 终端运行Flask项目http的请求与响应flask的生命周期请求获取请求中各项数据获取请求URL参数获取请求体获取请求头相关信息 响应响应html文本…...
pve 直通硬盘
qm set <vm_id> –<disk_type>[n] /dev/disk/by-id/- b r a n d − brand- brand−model_$serial_number <vm_id> : 为创建虚拟机时指定的VM ID。 <disk_type>[n]: 导入后的磁盘的总线类型及其编号,总线类型可以选择IDE、SATA…...
NLP_情感分类_机器学习(w2v)方案
文章目录 项目背景数据清洗导包导入数据切分评论及标签Word2Vec构造w2v 数据切分模型训练查看结果 同类型项目 项目背景 项目的目的,是为了对情感评论数据集进行预测打标。在训练之前,需要对数据进行数据清洗环节,前面已对数据进行清洗&…...
240929-CGAN条件生成对抗网络
240929-CGAN条件生成对抗网络 前面我们学习了GAN(240925-GAN生成对抗网络-CSDN博客)和DCGAN(240929-DCGAN生成漫画头像-CSDN博客),接下来继续来看CGAN(Conditional GAN)条件生成对抗网络。 流…...
springboot第74集:设计模式
解析 核心线程数与CPU核数相同:避免线程过多导致的上下文切换,提高CPU利用率。无界队列:适合任务量大且任务执行时间短的场景,避免因队列满而拒绝任务。 IO密集型任务 场景描述 适用于执行大量IO操作的任务,如文件读写…...
数字化采购管理革新:全过程数字化采购管理平台的架构与实施
摘要:在数字化转型的浪潮中,采购管理正逐步迈向全流程的数字化。本文将详细解析全过程数字化采购管理平台的技术架构和实施策略,探讨如何通过Spring Cloud、Spring Boot2、Mybatis等先进技术和服务框架,实现从供应商管理到采购招投…...
Webpack 特性探讨:CDN、分包、Tree Shaking 与热更新
文章目录 前言包准备CDN 集成代码分包Tree Shaking原理实现条件:解决 treeShaking 无效方案:示例代码: 热更新(HMR) 前言 Webpack 作为现代前端开发中的核心构建工具,提供了丰富的特性来帮助开发者优化和打…...
Robot Operating System——一组三维空间中的位姿(位置和方向)
大纲 应用场景1. 机器人导航场景描述具体应用 2. 运动规划场景描述具体应用 3. 物体识别和跟踪场景描述具体应用 4. 环境建模场景描述具体应用 5. 仿真环境场景描述具体应用 定义字段解释 案例 geometry_msgs::msg::PoseArray 是 ROS 2 中的一个消息类型,用于表示一…...
mycat读写分离中间件
5、部署Mycat读写分离中间件服务 5.1安装Mycat服务 将Mycat服务的二进制软件包Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz上传到Mycat虚拟机的/root目录下,并将软件包解压到/use/local目录中 5.2赋予解压后的mycat目录权限 5.3向/etc/profile系统变量…...
Growthly Quest 增长工具:助力 Web3 项目实现数据驱动的增长
作者:Stella L (stellafootprint.network) 在瞬息万变的 Web3 领域,众多项目在用户吸引、参与和留存方面遭遇重重难关。Footprint Analytics 推出 Growthly,作为应对这些挑战的全方位解决方案,其中创新性的 Quest(任务…...
Pytorch 学习手册
零 相关资料 官方网址 官方网址下的API搜索网站 一 定义 深度学习框架是用于设计、训练和部署深度学习模型的软件工具包。这些框架提供了一系列预定义的组件,如神经网络层(卷积层、全连接层等)、损失函数、优化器以及数据处理工具…...
第十一章 【前端】调用接口(11.1)——Vite 环境变量
第十一章 【前端】调用接口 11.1 Vite 环境变量 参考:https://cn.vitejs.dev/guide/env-and-mode.html Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 …...
MySQL添加时间戳字段并且判断插入或更新时间
文章目录 步骤 1: 修改表结构步骤 2: 插入或更新数据步骤 3: 查询数据并判断时间完整示例 在MySQL中,可以在表中添加一个时间戳字段来记录每条数据的最后插入或更新时间。然后,在插入或更新数据时,自动更新这个时间戳字段。最后,在…...
SOA(面相服务架构)
目录 SOA的基本概念 SOA的关键特性 SOA的实现步骤 SOA的技术实现 SOA的应用场景 面向服务的架构(Service-Oriented Architecture, SOA)是一种软件设计理念和架构模式,旨在通过网络协议将不同的服务相互连接和集成,以构建灵活、可扩展和可重用的应用系统。SOA的…...
One2many(一对多)关联场景中,如何从模型(一)关联到模型(多)的某个字段
好的,我们用一个更通俗的例子来解释不同模块之间的模型关联,场景是“学校和学生”的例子。 1. 场景介绍 假设我们有两个模块: 学校模块 (school):用于管理学校信息。学生模块 (student):用于管理学生信息。 每个学…...
LLaMA 3 和 OpenAI有哪些相同点和不同点?
LLaMA 3(Meta 的 LLaMA 系列)和 OpenAI 的模型(如 GPT 系列)都是先进的 大语言模型(LLMs),它们在训练、应用场景和能力上有很多相似之处,但也存在显著的不同点。以下是一些关键相同点…...
Spring 事务管理及失效总结
所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。 Spring 并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给 Hibernate 或者 JTA 等持久化机制所提供的相关平台框架的事务来实现。 Spring 事务…...
全局思维下的联合创新:华为携手ISV伙伴助推银行核心平稳升级
文 | 螳螂观察 作者 | 李永华 随着数字金融快速发展,对核心系统提出了“海量、高效、弹性、扩展、敏捷”等新需求,区域性银行面临核心系统升级的迫切需要,对金融科技厂商而言也催生了庞大的机遇和空间。 只是,银行核心系统是金…...
深度估计任务中的有监督和无监督训练
在计算机视觉领域,深度估计任务一直是研究的热点之一。它旨在通过图像或视频数据来推断场景中物体与相机之间的距离,为许多应用提供关键信息,如自动驾驶、机器人导航、增强现实等。在深度估计任务中,有监督训练和无监督训练是两种…...
扩散模型DDPM代码实践
安装diffusers pip install diffusers 按照diffusers官方代码 from diffusers import DDPMPipelinepipe DDPMPipeline.from_pretrained("google/ddpm-cat-256")image pipe().images[0]image.save("/data/zhz/projects/diffusion/output/ddpm_generated_imag…...
关于GPIO输入模式的配置选择
GPIO(通用输入输出)口是嵌入式系统中的重要组成部分,输入模式使得微控制器能够与外部世界进行交互。本文将探讨GPIO输入模式中的浮空输入、上拉输入和下拉输入的配置、使用场景及注意事项,并提供一些决策指导,帮助读者…...
【Kubernetes】日志平台EFK+Logstash+Kafka【实战】
一,环境准备 (1)下载镜像包(共3个): elasticsearch-7-12-1.tar.gz fluentd-containerd.tar.gz kibana-7-12-1.tar.gz (2)在node节点导入镜像: ctr -nk8s.io images i…...
今天推荐一个文档管理系统 Dorisoy.Pan
Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统,它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术,以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端,包括网站、Android、iO…...
【RocketMQ】消费失败重试与死信消息
🎯 导读:本文档详细介绍了RocketMQ中的重试机制与死信消息处理方法。对于生产者而言,文档提供了如何配置重试次数的具体示例;而对于消费者,它解释了默认情况下消息消费失败后的重试策略,并展示了如何通过代…...
注册安全分析报告:闪送
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
SpringCloud入门
SpringCloud 原版笔记:狂神说笔记——SpringCloud快速入门23 - subeiLY - 博客园 (cnblogs.com) 一.前言 常见面试题 什么是微服务? 微服务之间是如何独立通讯的? SpringCloud 和 Dubbo有哪些区别? SpringBoot和SpringCloud&…...
js替换css主题变量并切换iconfont文件
iconfont不止有单色、双色的图标,还有很多【多色】的图标,于是不能【去色】,只能手动替换primary 新建一个iconfont,替换过主题色的,然后与旧的iconfont配合切换使用 主要如下: reqiure之前必须【清除缓…...
UI设计师面试整理-设计趋势和行业理解
在UI设计师的面试中,了解当前的设计趋势和行业动态可以让你在面试中展示你的前瞻性思维和对设计领域的深刻理解。面试官希望看到你不仅具备扎实的设计技能,还能够洞察和应用最新的设计趋势和技术。以下是一些当前的设计趋势和如何在面试中展示你对这些趋势的理解和应用的建议…...
wordpress分销插件/发外链软件
ROS action客户端和服务端通信 gcusms ROS 一般都是用 service 和 topic 进行数据之间的交互传输,因为这种通信方式无法满数据实时反馈的要求,所以采用 action 动作消息反馈通信机制(实时反馈的任务进度,并且可以随时终止运行&am…...
个人制作网站多少钱/seo优化培训多少钱
介绍一下自己 一开始问项目(我的项目跟网络相关)中的拥塞控制、流量控制;简单介绍了一下协议做的事情。有什么拥塞控制协议:Reno和BBR介绍一下Reno协议的工作方式;UDP 和 TCP 的区别,都适合什么场景&#x…...
永州高端网站建设/酒店seo是什么意思
1、作用 权重分析是通过熵权法对问卷调查的指标的重要性进行权重输出,根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大, 该指标对综合评价的影响&a…...
开江建设局网站/seo综合查询怎么关闭
htons(), ntohl(), ntohs(),htons() 函数: 转载自:https://blog.csdn.net/myyllove/article/details/83380209 atoi()和itoa()函数 转载自:https://www.cnblogs.com/ralap7/p/9171613.html...
重庆企业网站建设哪家专业/重庆seo怎么样
Wolfram Alpha创始人沃尔夫勒姆的自述 在Y Combinator创业学校的演讲 Stephen Wolfram 编者按: 斯蒂芬•沃尔夫勒姆(Stephen Wolfram)15岁就发表论文,但因为觉得学校学的东西无聊于17岁肄业于伊顿公学;17岁至18岁在牛津…...
柯桥做网站哪家好/网络软文营销案例
使用 sorted() 函数的 key 参数对元组列表进行排序,例如 sorted_list sorted(list_of_tuples, keylambda t: t[1])。 该函数将按指定索引处的元组元素对元组列表进行排序。 list_of_tuples [(1, 100), (2, 50), (3, 75)]# ✅ 按索引处的元素对元组列表进行排序&a…...