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

在这里插入图片描述

过滤器(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.mfbz.cn/a/126383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 自定义分页控件

目录 前言1、功能描述2、代码实现2.1 ui文件2.1 头文件2.2 源码文件2.3 设计思路 4、示例5、总结 前言 在应用程序开发时经常会遇到数据分页的需求&#xff0c;每一页展示特定数量的数据&#xff0c;通过点击按钮翻页或者输入页码跳转到指定页。 本文介绍一个自定义分页控件&a…

【Spring】静态代理

例子&#xff1a; 租房子 角色&#xff1a; 我 &#xff08;I ) 中介( Proxy ) 房东( host ) Rent 接口 package org.example;public interface Rent {void rent(); }房东 package org.example;public class Host implements Rent{Overridepublic void rent() …

立体相机标定

相机成像过程中涉及的4个坐标系&#xff1a; 1、世界坐标系&#xff1a;由用户定义的三维世界坐标系&#xff0c;描述物体和相机在真实世界中的位置&#xff0c;原点可以任意选择。 2、相机坐标系&#xff1a;以相机的光心为坐标原点&#xff0c;X轴和Y轴平行于图像坐标系的X轴…

uniapp实现在线PDF文件预览

下载pdf文件放在static文件夹下 bug&#xff1a;hbuildX创建的项目pdf文件夹可以放在根目录下面&#xff0c;但是cli创建的项目无法预览&#xff0c;只能放在static下面 按钮跳转预览页面 <button click"toPdf">pdf</button>methods: {toPdf() {uni.…

接口测试|HttpRunner模拟发送GET请求自动生成测试报告

HttpRunner模拟发送GET请求&自动生成测试报告 前面说到&#xff0c;HttpRunner必须使用yaml或者json文件来进行使用&#xff0c;测试场景文件推荐使用yaml文件进行编辑。 httprunner 项目下yaml文件的格式 在python项目下新建一个 testcases 文件夹&#xff0c;然后再新…

K8s----资源管理

目录 一、Secret 1、创建 Secret 1.1 用kubectl create secret命令创建Secret 1.2 内容用 base64 编码&#xff0c;创建Secret 2、使用方式 2.1 将 Secret 挂载到 Volume 中&#xff0c;以 Volume 的形式挂载到 Pod 的某个目录下 2.2 将 Secret 导出到环境变量中 二、Co…

一文概览NLP句法分析:从理论到PyTorch实战解读

本文全面探讨了自然语言处理&#xff08;NLP&#xff09;中句法分析的理论与实践。从句法和语法的定义&#xff0c;到各类句法理论和方法&#xff0c;文章细致入微地解析了句法分析的多个维度。最后&#xff0c;通过PyTorch的实战演示&#xff0c;我们展示了如何将这些理论应用…

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

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

Milvus Cloud——Agent 框架工作方式

Agent 框架工作方式 我们以 AutoGPT 为例&#xff0c;看看一个 Agent 框架具体是如何工作的&#xff1a; AutoGPT[2] 使用 GPT-4 来生成任务、确定优先级并执行任务&#xff0c;同时使用插件进行互联网浏览和其他访问。AutoGPT 使用外部记忆来跟踪它正在做什么并提供上下文&am…

(免费领源码)Node.js#koa#MySQL精品课程网站27724-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1研究背景 1.2研究现状及意义 1.3koa框架 1.4论文结构与章节安排 2精品课程网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

如何捕捉牛熊转变的信号,澳福认为只需了解一个模式

在过去的交易市场&#xff0c;当所有的多头都买了&#xff0c;没有新的买家时&#xff0c;牛市就结束了。但是在今天的交易市场&#xff0c;激进的卖空者也会出现在趋势的顶部&#xff0c;澳福知道这个事实会改变重要趋势结束时的市场行为。当多头让位于空头时&#xff0c;牛市…

计蒜客详解合集(1)期

以后对于简单题目&#xff0c;大致6道题目出一期&#xff0c;稍有难度的才单独一期发布~ 目录 T1266——出勤记录 T1170——人民币支付 T1122——最长最短单词 T1115——字符串判等 T1116——验证子串 T1118——删除单词后缀 T1266——出勤记录 小蒜的算法课老师每次…

向量的范数、矩阵的范数

向量的范数 p-范数 常用的0-范数、1-范数、2-范数、无穷-范数其实都是p-范数的特殊情形。 0-范数 当p0时&#xff0c;表示0-范数。它比较特殊&#xff0c;本质是一种计数&#xff0c;表示向量中非0元素的个数。 1-范数&#xff08;也称L1范数&#xff09; 当p1时&#xff…

软件开发项目文档系列之十五如何撰写项目结项报告

这是一个项目总结文档的说明文件&#xff0c;它提供了项目的概述、建设情况、技术情况、测试情况、培训情况、试运行情况、主要成效等详细信息。 1 项目概述 项目名称&#xff1a;明确指定了项目的名称&#xff0c;这有助于确保文件的清晰性和易读性。 项目相关单位&#xff…

读写锁ReentrantReadWriteLock

读写锁ReentrantReadWriteLock是JDK1.5提供的一个工具锁&#xff0c;适用于读多写少的场景&#xff0c;将读写分离&#xff0c;从而提高并发性。读写锁允许的情况&#xff1a;一个资源可以被多个读操作访问&#xff0c;或者被一个写操作访问&#xff0c;但两者不能同时进行。 R…

【广州华锐互动】VR安防网络综合布线仿真实训打造沉浸式的教学体验

随着科技的快速发展&#xff0c;综合布线技术在建筑、数据中心、网络基础设施等领域的应用越来越广泛。为了适应这一趋势&#xff0c;传统的教学方法已经无法满足现代教育的需求。因此&#xff0c;采用创新的教学手段&#xff0c;如虚拟现实&#xff08;VR&#xff09;技术&…

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

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

【被面试官吊打系列】啥,你没说面试要考智力题呀 (上) ?

你好&#xff0c;我是安然无虞。 文章目录 1. 二进制问题分金条问题毒药问题 2. 先手必胜问题轮流拿石子抢30的必胜策略Nim游戏 3. 水桶问题5L和6L的水桶怎么量出3L的水&#xff1f;3L和5L的水桶怎么量出4L的水&#xff1f;一个装了10L水的桶&#xff0c;一个7L的空桶还有一个…

Windows搭建minio存储

minio功能类似以ftp 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.下载软件 https://dl.min.io/server/minio/release/windows-amd64/minio.exe 2.部署配置 我是在D盘下创建了minio目录 minio.exe是软件minio.log是日志&#xff08;不用创建&#xff09;minio900…

借钱正成为互联网一大坑,影响你的房贷,悄悄吞噬消费者

如今各个APP都可以给消费者提供贷款&#xff0c;由于网贷已坑了不少人&#xff0c;许多用户都选择了拒绝&#xff0c;不过APP的另一大坑却在悄悄影响消费者的征信&#xff0c;对消费者包括房贷在内的贷款产生影响。 互联网的这个坑就是先用后付功能&#xff0c;表面上各个APP以…
最新文章