首页 > 编程语言 >一文详解Filter类源码和应用

一文详解Filter类源码和应用

时间:2025-01-22 22:57:53浏览次数:3  
标签:请求 request Filter doFilter 源码 LoggingFilter response 详解

背景

        在日常开发中,经常会有需要统一对请求做一些处理,常见的比如记录日志、权限安全控制、响应处理等。此时,ServletApi中的Filter类,就可以很方便的实现上述效果。

   Filter类 是一个接口,属于 Java Servlet API 的一部分,主要用于在 Servlet 处理请求之前或之后执行过滤任务。Filter 的作用是拦截请求和响应,从而实现一些通用的功能,而无需修改 Servlet 或 JSP 的代码。

Filter源码

        从Filter的源码,可以看出:Filter是一个接口,Filter 的生命周期由三个主要方法控制。分别是init / doFilter / destory方法。

        接下来具体讲一下,这三个方法的作用:

  1. init(FilterConfig filterConfig)初始化 Filter,在 Filter 被加载时调用一次。一般用于加载资源、初始化配置信息等。(从入参FilterConfig看出,可以获得上下文、请求参数等信息

  2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain):核心方法,用于处理一些具体的过滤逻辑。(可以获得并处理request, response信息)

    1. 在调用 chain.doFilter(request, response) 之前,可以对请求进行预处理。

    2. 在调用 chain.doFilter(request, response) 之后,可以对响应进行后处理。

    3. 如果不想让请求继续向下传递,可以不调用 chain.doFilter(request, response)

  3. destroy():销毁 Filter,在 Filter 被卸载时调用一次。一般用于释放资源、清理等逻辑。

Filter场景 

  Filter 的核心功能是拦截请求和响应,从而实现以下功能:

  • 日志记录:记录请求的详细信息,如请求的 URL、参数、时间戳等。

  • 权限检查:验证用户是否具有访问特定资源的权限。

  • 响应修改:修改响应的内容或格式,例如添加 HTTP 响应头。

  • 资源管理:限制对某些资源的访问频率或次数。

Filter使用示例

        例如,我们可以在每次请求中,记录请求的耗时时长,并在注入TRACE_ID参数,以方便后续根据日志,进行链路追踪。

import javax.servlet.*;
import java.io.IOException;

public class LoggingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LoggingFilter initialized");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        String traceId = request.getHeader("TRACE_ID");
        if (StrUtil.isBlank(traceId)) {
            traceId = UUID.randomUUID().toString().toLowerCase().replaceAll("-", "");
        }

        try {
            //设置链路ID
            MDC.put("TRACE_ID", traceId);
            response.addHeader("TRACE_ID",traceId);

            // 调用下一个 Filter 或 Servlet
            chain.doFilter(request, response);
        }finally {
            MDC.remove("traceId");com.zwy.discover.mybatis.LogConfig.remove();
        }


        long endTime = System.currentTimeMillis();
        //打印请求耗时
        System.out.println("Request processed in " + (endTime - startTime) + " ms");
    }

    @Override
    public void destroy() {
        System.out.println("LoggingFilter destroyed");
    }
}

Filter配置方式

  • 使用 web.xml 配置

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.example.LoggingFilter</filter-class>
    <init-param>
        <param-name>param1</param-name>
        <param-value>value1</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>LoggingFilter</filter-name>
    <!-- 拦截所有请求 -->
    <url-pattern>/*</url-pattern> 
</filter-mapping>
  • 使用注解配置(Servlet 3.0+)

        从 Servlet 3.0 开始,可以使用 @WebFilter 注解来定义 Filter,无需在 web.xml 中配置。

@WebFilter(filterName = "LoggingFilter", urlPatterns = "/*")
public class LoggingFilter implements Filter {
    // Filter 方法实现
}

         

标签:请求,request,Filter,doFilter,源码,LoggingFilter,response,详解
From: https://blog.csdn.net/weixin_40709965/article/details/145311153

相关文章

  • 短视频矩阵系统源码搭建,支持OEM
    一、引言在当今数字化时代,矩阵系统在众多领域有着广泛应用,如数据分析、图像处理、科学计算等。搭建一个高效的矩阵系统源码,能够帮助开发者更好地利用矩阵运算的优势,实现复杂功能。本文将详细介绍矩阵系统源码搭建的过程。二、矩阵系统基础概念矩阵是一个按照长方阵列排列的......
  • 基于springboot的校园服务交流平台系统(源码+文档)
    项目简介一、目的:为校园内的师生提供一个便捷的信息交流和服务共享平台。在校园环境中,学生和教师常常面临各种需求,如学习资料分享、二手物品交易、校园活动组织、课程互助、生活服务推荐等,此系统旨在将这些需求汇聚一处。利用SpringBoot框架构建,旨在开发出一个稳定、......
  • 开源项目芋道源码解析 [开篇]
    文章首发于我的博客:https://blog.liuzijian.com/post/source-code-about-ruoyi-vue-pro.html1.引言芋道(又名yudao,ruoyi-vue-pro)是一个基于spring-boot框架的单体Java后端开源项目,拥有基于RBAC模型的组织架构管理、CRM、ERP、商城、代码生成、AI等多个功能模块。封装了多租户、......
  • springboot714校园疫情防控系统(论文+源码)_kaic
    摘 要随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,校园疫情防控系统就是信息时代变革中的产物之一。任何系统都要遵循系统设计......
  • Spring 依赖注入详解:创建 Bean 和注入依赖是一回事吗?
    1.什么是依赖注入(DependencyInjection,DI)?依赖注入是SpringIoC(控制反转)容器的核心功能。它的目标是将对象的依赖(如其他对象或配置)从对象本身中剥离,由容器负责注入这些依赖。关键概念:依赖:一个对象需要的其他对象或资源。例如,UserController需要UserService。注入:Sprin......
  • 数据库事务详解
    事务-1-数据库事务今天聊一聊数据库的事务,这里以MySQL为例子。在MySQL中,事务(Transaction)是一组SQL操作的集合,这些操作要么全部成功执行,要么全部失败回滚,确保数据的一致性和完整性。事务具有以下四个关键特性,通常称为ACID特性:原子性(Atomicity):事务中的所有操作要么全部完成,要么......
  • 学生管理系统C++版(简单版)详解
    有错请指出啊~,答应大家的来了头文件:#include<iostream>#include<stdlib.h>#include<windows.h>iostream是标准头文件,stdlib.h也可以写成cstdlib,windows.h,用Sleep数据定义:intx,y=0;//x是输入,y是xm的下标,初始化y为0详解见代码。 结构体类型:structStudent{  c......
  • 「全网最细 + 实战源码案例」设计模式——简单工厂模式
    ​核心思想简单工厂模式是一种创建者模式,它通过一个工厂类负责创建不同类型的对象,根据传入的参数决定实例化的具体类,也被称为“静态工厂方法”模式,因为工厂方法通常是静态的。结构1.工厂类:提供一个静态方法,根据不同条件创建并返回具体的产品对象。2.产品接口(抽象类)......
  • 「全网最细 + 实战源码案例」设计模式——工厂方法模式
    核心思想简单工厂模式是一种创建者模式,它通过一个工厂类负责创建不同类型的对象,根据传入的参数决定实例化的具体类,也被称为“静态工厂方法”模式,因为工厂方法通常是静态的。结构1.工厂类:提供一个静态方法,根据不同条件创建并返回具体的产品对象。2.产品接口(抽象类)定......
  • 基于java web的社区人员流动管理系统的设计与实现-毕业设计源码19467
    目 录1绪论1.1研究背景与意义1.2国内外研究现状1.3论文结构与章节安排2 系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3系统用例分析2.4系......