【Java 进阶篇】Java Filter 过滤器链详解

news2024/12/27 10:47:28

在这里插入图片描述

过滤器(Filter)是 Java Web 应用中重要的组件之一,它用于在请求到达 Servlet 之前或响应返回客户端之前对请求和响应进行处理。在实际开发中,我们可能会使用多个过滤器来完成不同的任务,这就引出了过滤器链的概念。本文将详细介绍 Java 中过滤器链的工作原理和使用方法。

过滤器链简介

过滤器链是由多个过滤器按照一定的顺序组成的链状结构。当请求到达 Servlet 之前,或者响应返回客户端之前,请求和响应都会依次经过过滤器链中的每个过滤器,每个过滤器都可以对请求和响应进行处理。过滤器链的执行顺序由过滤器在 web.xml 文件或使用注解配置时的顺序决定。

过滤器链的执行流程

过滤器链的执行流程可以分为以下几个阶段:

  1. 过滤器初始化: 在 Web 应用启动时,所有配置的过滤器都会被初始化。在初始化阶段,过滤器可以执行一些必要的初始化操作。

  2. 请求到达过滤器链: 当客户端发起请求时,请求会经过过滤器链。每个过滤器在 doFilter 方法中执行自己的逻辑,然后调用过滤器链上的下一个过滤器的 doFilter 方法。

  3. Servlet 处理请求: 如果请求通过了所有过滤器的处理,它将到达目标 Servlet。Servlet 处理完请求后,响应会返回到过滤器链。

  4. 响应经过过滤器链: 响应会按照与请求相反的顺序经过过滤器链。每个过滤器在 doFilter 方法中执行自己的逻辑,然后调用过滤器链上的下一个过滤器的 doFilter 方法。

  5. 过滤器销毁: 在 Web 应用关闭或被卸载时,过滤器将被销毁。在销毁阶段,过滤器可以执行一些必要的清理操作。

过滤器链的配置

通过 web.xml 文件配置过滤器链

web.xml 文件中,可以通过 <filter><filter-mapping> 元素配置过滤器及其拦截路径。以下是一个简单的示例:

<web-app>
    <!-- 配置过滤器 -->
    <filter>
        <filter-name>Filter1</filter-name>
        <filter-class>com.example.Filter1</filter-class>
    </filter>
    <filter>
        <filter-name>Filter2</filter-name>
        <filter-class>com.example.Filter2</filter-class>
    </filter>

    <!-- 配置过滤器映射 -->
    <filter-mapping>
        <filter-name>Filter1</filter-name>
        <url-pattern>/secure/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>Filter2</filter-name>
        <url-pattern>/secure/*</url-pattern>
    </filter-mapping>
</web-app>

在上述示例中,我们配置了两个过滤器 Filter1Filter2,并指定它们的拦截路径为 /secure/*。请求经过该路径时,将会依次执行 Filter1Filter2

通过注解配置过滤器链

使用注解配置过滤器链更加简洁,可以在过滤器类上使用 @WebFilter 注解进行配置。以下是一个使用注解配置过滤器链的示例:

@WebFilter(filterName = "Filter1", urlPatterns = {"/secure/*"})
public class Filter1 implements Filter {
    // 过滤器的实现
}

@WebFilter(filterName = "Filter2", urlPatterns = {"/secure/*"})
public class Filter2 implements Filter {
    // 过滤器的实现
}

在上述示例中,我们通过 @WebFilter 注解配置了两个过滤器 Filter1Filter2,并指定它们的拦截路径为 /secure/*

过滤器链的工作原理

过滤器链的工作原理涉及到 FilterChain 接口,它定义了过滤器链的基本操作。FilterChain 接口包含一个 doFilter 方法,该方法用于在过滤器链上执行过滤器的逻辑,并调用链上的下一个过滤器。以下是 FilterChain 接口的简化版本:

public interface FilterChain {
    void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
}

在过滤器的 doFilter 方法中,开发者需要显式调用 FilterChaindoFilter 方法,以便请求能够继续传递到下一个过滤器。如果在某个过滤器的 doFilter 方法中没有调用 FilterChaindoFilter 方法,请求将被阻塞,不会继续传递到后续的过滤器或 Servlet。

下面是一个简单的过滤器示例,演示了如何在 doFilter 方法中调用过滤器链:

@WebFilter(filterName = "MyFilter", urlPatterns = {"/secure/*"})
public class MyFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 执行过滤器的逻辑,例如对请求进行处理
        
        // 调用过滤器链的下一个过滤器
        chain.doFilter(request, response);
        
        // 执行过滤器的逻辑,例如对响应进行处理
    }

    // 其他方法,例如初始化和销毁方法
}

在上述示例中,MyFilter 过滤器通过调用 chain.doFilter(request, response) 将请求传递给过滤器链的下一个过滤器。在此之前和之后,可以编写一些逻辑来处理请求和响应。

过滤器链的顺序

过滤器链的执行顺序由过滤器在配置时的顺序决定。在 web.xml 文件或使用注解配置时,过滤器的声明顺序就是它们在过滤器链中的执行顺序。

web.xml 文件中配置过滤器时,可以使用 <filter-mapping> 元素的 <dispatcher> 子元素来指定过滤器的拦截类型。例如:

<filter-mapping>
    <filter-name>Filter1</filter-name>
    <url-pattern>/secure/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

在上述示例中,<dispatcher> 元素指定了过滤器 Filter1 只拦截请求(REQUEST),而不拦截转发或包含等操作。这可以影响过滤器链的执行顺序。

总结

过滤器链是 Java Web 应用中用于处理请求和响应的重要机制之一。通过配置多个过滤器组成过滤器链,我们可以实现更灵活、可扩展的请求处理逻辑。了解过滤器链的执行流程和工作原理,对于开发复杂的 Web 应用是非常有帮助的。通过适当的配置和使用,过滤器链可以成为 Web 开发中强大而高效的工具。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[量化投资-学习笔记009]Python+TDengine从零开始搭建量化分析平台-KDJ

技术分析有点像烹饪&#xff0c;收盘价、最值、成交量等是食材&#xff1b;均值&#xff0c;移动平均&#xff0c;方差等是烹饪方法。随意组合一下就是一个技术指标。 KDJ又称随机指标&#xff08;随机这个名字起的很好&#xff09;。KDJ的计算依据是最高价、最低价和收盘价。…

Unity--UGUI创建基本的UI

随着UI系统的引入&#xff0c;已添加了新组件&#xff0c;这些组件将有助于创建特定于GUI的功能。其中一些元素包括文本&#xff0c;图像&#xff0c;按钮等。在本教程中&#xff0c;您将学习创建和使用基本UI。 1.创建基本的UI 通过Unity的用户界面&#xff08;UI&#xff09;…

UE5数字孪生制作-数据篇(二) - 数据处理

1.卫星图与DEM高度图坐标一致处理 https://www.bilibili.com/video/BV1op4y1V71r?p4&vd_source707ec8983cc32e6e065d5496a7f79ee6 坐标系的调整 如何使用临时图层&#xff0c;对其他数据层进行裁切 &#xff08;1&#xff09;创建临时图层 &#xff08;2&#xff09;在临…

Zotero拓展功能之Zotero Style

Zotero Style拓展功能 一、列&#xff1a; 1.简介 首先你必须知道Zotero的基本功能&#xff1a;右键任意一个列的名字&#xff0c;会弹出一个右键菜单&#xff0c;你可以勾选/取消勾选一个列&#xff0c;并且在最后有两个按钮&#xff0c;一个是“列设置”&#xff0c;一个是…

如何用Java实现一个基于机器学习的情感分析系统,用于分析文本中的情感倾向

背景&#xff1a;练习两年半&#xff08;其实是两周半&#xff09;&#xff0c;利用工作闲余时间入门一下机器学习&#xff0c;本文没有完整的可实施的案例&#xff0c;由于知识体系不全面&#xff0c;目前代码只能运行&#xff0c;不能准确的预测 卡点&#xff1a; 1 由于过…

WebSocket在node端和客户端的使用

摘要 如果想要实现一个聊天的功能&#xff0c;就会想到使用WebSocket来搭建。那如果没有WebSocet的时候&#xff0c;我们会以什么样的思路来实现聊天功能呢&#xff1f; 假如有一个A页面 和 B页面进行通信&#xff0c;当A发送信息后&#xff0c;我们可以将信息存储在文件或者…

程序员35岁之后如何规划?建议收藏!

文章目录 一、年纪大能不能进大厂&#xff1f;二、为什么说35是危机&#xff1f; 1.精力衰退2.脑力衰退3.知识/技术迭代 三、年龄大的程序员有哪些出路&#xff1f; 1.技术管理2.创业3.技术外包4.做老师5.做自媒体6.写书 四、结语 我自己今年已有44了&#xff0c;从2021年开始…

基于讯飞星火大语言模型开发的智能插件:小策问答

星火大语言模型是一种基于深度学习的自然语言处理技术&#xff0c;它能够理解和生成人类语言。这种模型的训练过程涉及到大量的数据和复杂的算法&#xff0c;但最终的目标是让机器能够像人一样理解和使用语言。 小策问答是一款基于星火大语言模型的定制化GPT插件小工具。它的主…

学习OpenCV(蝴蝶书/C++)相关——2.MacOS下使用LLDB调试cpp程序

文章目录 1. VScode中的调试2. 配置VSCode中C++的调试(以OpenCV为例)2.1 创建适用于C++的.launch文件2.2 常见参数说明2.3 调试OpenCV的.launch文件示例2.3.1 .launch文件demo2.3.2 Debug模式的可执行文件之前在 mac下vscode配置c++环境用过简单的launch.json的配置。 但是不足…

idea Plugins 搜索不到插件

Settings — System Settings — HTTP Proxy&#xff0c;打开HTTP Proxy 页面&#xff0c;设置自动发现代理&#xff1a; 勾选Atuto-detect proxy settings&#xff0c;勾选Automatic proxy configuration URL&#xff0c;输入&#xff1a; https://plugins.jetbrains.com/id…

【Java】I/O流—缓冲流的基础入门和文件拷贝的实战应用

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;你能坚持到什么程度&#xff0c;决定你能达到什么高度 &#x1f4e2;欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 文章目录 一.&…

01 计算机图形学概述

什么是图形学 合成和操作视觉信息。 图形学的应用 游戏 电影 动画 模拟 设计 可视化 虚拟现实VR&增强现实AR 电子绘画 图形化UI 字体 图形学的挑战 思维上的挑战 创建与虚拟世界互动需要了解物理世界的各个方面新的计算方法&#xff0c;显示&#xff0c;技术 技术上…

MemcachedRedis构建缓存服务器 (主从,持久化,哨兵)

许多Web应用都将数据保存到 RDBMS中&#xff0c;应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中&#xff0c;就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能的分布式内存缓存服务器,通过缓存数据库查询…

【Python 千题 —— 基础篇】菜品的价格

题目描述 题目描述 食堂今天准备了很多好吃的菜。“beef” 12 元一份&#xff1b;“rice” 1 元一份&#xff1b;“fish” 8 元一份&#xff1b;其它菜品 5 元一份。请你根据输入的字符串&#xff0c;使用 if-elif-else 语句判断该菜品需要花费多少钱。 输入描述 输入一个菜…

在gitlab中指定自定义 CI/CD 配置文件

文章目录 1. 介绍2. 配置操作3. 配置场景3.1 CI/CD 配置文件在当前项目step1&#xff1a;在当前项目中创建目录&#xff0c;编写流水线文件存放在该目录中step2&#xff1a;在当前项目中配置step3&#xff1a;运行流水线测试 3.2 CI/CD 配置文件位于外部站点上step1&#xff1a…

IP-guard WebServer RCE漏洞复现

0x01 产品简介 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件&#xff0c;旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 0x02 漏洞概述 漏洞成因 在Web应用程序的实现中&#xff0c;参数的处理和验证是确保应用安全的关键环节…

OTA设计思路

什么是 Zigbee 协议&#xff1f; Zigbee 技术是一种连接距离短、功耗低、复杂程度低、数据传输量低的无线通信技术&#xff0c;其命名灵感源自于蜜蜂在群体中的信息传输。它主要通过网关与互联网进行通信&#xff0c;并嵌入各种智能设备&#xff0c;最终实现自动控制和远程控制…

【C++】STL容器适配器——queue类的使用指南(含代码使用)(18)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一、queue 类——基本介绍二、queue 类…

绝对力作:解锁string的所有关键接口,万字深度解析!

W...Y的主页 &#x1f60a; &#x1f354;前言&#xff1a; 通过博主的上篇文章&#xff0c;我相信大家已经认识了STL并且已经迫不及待想学习了&#xff0c;现在我们就走近STL的第一种类——string。 目录 为什么学习string类&#xff1f; C语言中的字符串 标准库中的str…

【T3】畅捷通T3采购管理模块反结账,提示:本年数据已经结转,不能取消结账。

【问题描述】 使用畅捷通T3软件过程中&#xff0c; 针对以前年度进行反结账过程中&#xff0c;遇到采购管理模块取消12月份结账&#xff0c; 提示&#xff1a;本年数据已经结转&#xff0c;不能取消结账。 【分析需求】 按正常逻辑&#xff0c;需要清空新年度数据&#xff0c…