Spring Security架构中过滤器的实现
Spring Security过滤器基础
过滤器链工作原理
在Spring Security架构中,过滤器链(Filter Chain)是安全机制的核心实现方式。当HTTP请求到达时,会依次通过一系列具有明确顺序的过滤器。例如认证过滤器会拦截请求并将认证职责委托给授权管理器。若需要在认证前执行特定逻辑,只需在认证过滤器之前插入自定义过滤器即可。
Spring Security的过滤器属于典型的HTTP过滤器,通过实现jakarta.servlet.Filter
接口来创建。与其他HTTP过滤器相同,开发者需要重写doFilter()
方法来实现业务逻辑。该方法包含三个关键参数:
- ServletRequest:封装HTTP请求对象,用于获取请求详情
- ServletResponse:封装HTTP响应对象,用于修改返回给客户端的响应内容
- FilterChain:代表过滤器链,用于将请求传递给链中的下一个过滤器
Jakarta EE规范变更
从Spring Boot 3开始,Jakarta EE正式取代了原有的Java EE规范。这一变更导致部分包路径前缀从javax
变更为jakarta
。例如:
// 旧版Java EE规范
import javax.servlet.Filter;// 新版Jakarta EE规范
import jakarta.servlet.Filter;
该变更影响了Filter
、ServletRequest
、ServletResponse
等核心接口的包路径,开发者在迁移项目时需要特别注意。
内置过滤器示例
Spring Security提供了多个预置过滤器实现,以下是典型示例:
// HTTP基础认证过滤器
BasicAuthenticationFilter
// CSRF防护过滤器(第9章详解)
CsrfFilter
// CORS授权规则过滤器(第10章详解)
CorsFilter
过滤器链的长度会根据应用配置动态变化。例如调用HttpSecurity
的httpBasic()
方法时,系统会自动将BasicAuthenticationFilter
实例加入过滤器链。
过滤器顺序机制
过滤器的执行顺序由order值决定,开发者可以通过以下方式控制位置:
- 相对位置插入:在已知过滤器前后插入
- 绝对顺序指定:直接定义order数值
当多个过滤器具有相同order值时,其执行顺序无法保证。以下是添加过滤器的典型代码示例:
@Configuration
public class ProjectConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.addFilterBefore(new CustomFilter(), BasicAuthenticationFilter.class).authorizeRequests(c -> c.anyRequest().permitAll());return http.build();}
}
核心方法实现
自定义过滤器需要实现doFilter()
方法的核心逻辑,例如请求头校验:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;String header = httpRequest.getHeader("Request-Id");if(header == null) {((HttpServletResponse)response).setStatus(400);return;}chain.doFilter(request, response);
}
该示例会检查请求是否包含Request-Id
头,缺失时返回400状态码,否则继续执行后续过滤器。
Spring Security内置过滤器详解
基础认证过滤器
BasicAuthenticationFilter是处理HTTP基础认证的核心组件,当应用启用httpBasic()
配置时,该过滤器会自动加入过滤器链。其工作流程包括解析Authorization
请求头中的Base64凭证,并将认证请求委托给AuthenticationManager处理。
// 启用HTTP基础认证的配置示例
@Configuration
public class SecurityConfig {@BeanSecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {http.httpBasic().and().authorizeRequests().anyRequest().authenticated();return http.build();}
}
CSRF防护机制
CsrfFilter提供跨站请求伪造防护功能,其核心实现原理包括:
- 对非安全HTTP方法(POST/PUT/DELETE等)进行令牌验证
- 自动生成并验证
_csrf
参数 - 支持通过Cookie或Session存储令牌
可通过以下方式定制配置:
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).ignoringAntMatchers("/api/public/**");
CORS授权控制
CorsFilter实现跨域资源共享策略,主要处理以下请求头:
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Max-Age
典型配置示例:
@Bean
CorsConfigurationSource corsConfigurationSource() {CorsConfiguration config = new CorsConfiguration();config.setAllowedOrigins(Arrays.asList("https://domain.com")
相关文章:
Spring Security架构中过滤器的实现
Spring Security过滤器基础 过滤器链工作原理 在Spring Security架构中,过滤器链(Filter Chain)是安全机制的核心实现方式。当HTTP请求到达时,会依次通过一系列具有明确顺序的过滤器。例如认证过滤器会拦截请求并将认证职责委托给授权管理器。若需要在认证前执行特定逻辑…...
Playwright Python API 测试:从入门到实践
Playwright Python API 测试:从入门到实践 在现代软件开发中,API 测试是确保应用程序后端功能正常运行的关键环节。Playwright 是一个强大的自动化测试工具,支持多种编程语言,其中包括 Python。通过 Playwright,我们可…...

ETL脚本节点使用的方式
随着大数据时代的到来,企业对数据处理的需求日益增长,ETL 作为数据整合的关键技术,逐渐走进我们的视野。本文将为您揭秘 ETL 脚本节点的使用方式,助您轻松驾驭数据处理新境界。 一、ETL脚本的优势 1.提高效率:ETL 脚…...

PH热榜 | 2025-06-02
1. Circuit Tracer 标语:Anthropic的开放工具:让我们了解AI是如何思考的 介绍:Anthropic的开源工具Circuit Tracer可以帮助研究人员理解大型语言模型(LLMs),它通过将内部计算可视化为归因图的方式展现相关…...
Domain Adaptation in Vision-Language Models (2023–2025): A Comprehensive Review
Domain Adaptation in Vision-Language Models (2023–2025): A Comprehensive Review Overview Recent research (2023–2025) has increasingly focused on adapting large Vision-Language Models (VLMs) to new domains and tasks with minimal supervision. A core tren…...
容器化革命:告别传统Dockerfile,拥抱现代构建最佳实践
前言 还记得我第一次自信满满地写Dockerfile时,感觉自己像个DevOps天才👑。但很快我就发现,管理这些文件变成了噩梦——安全问题、意外的构建问题、臃肿的镜像层出不穷。如果你一直在手动编写Dockerfile,让我告诉你:有更好的方法! 本文将揭示传统Dockerfile编写方式的…...

: influxdb + grafana+JMeter
influxdb和Grafana 不安装在被测机器上,可以统一放到一台机器上面 1、influxdb:一种时序数据库, 可以永久性保存数据【除非手动清除和数据库坏了】 2、Grafana:grafana是一款用go编写的开源应用,用于大规模指标数据的可…...
Vue拖拽组件:vue-draggable-plus
vue-draggable-plus 学习文档 简介 vue-draggable-plus 是一个基于 Sortablejs 的 Vue 拖拽排序组件,专为 Vue 3 (>v3) 或 Vue >2.7 设计。该组件解决了官方 Sortablejs Vue 组件与 Vue 3 严重脱节的问题。 核心特性 🎯 多种使用方式ÿ…...

TDengine 基于 TDgpt 的 AI 应用实战
基于 TDgpt 时序数据智能体的风力发电预测 作者: derekchen Demo 数据集准备 我们使用公开的UTSD数据集里面的某风场发电数据,作为预测算法的数据来源,基于历史数据预测未来一天内的每15分钟的发电量。原始数据集的采集频次为4秒ÿ…...

RocketMQ 消息发送核心源码解析:DefaultMQProducerImpl.send () 方法深度剖析
引言 在分布式系统中,消息队列是实现异步通信、服务解耦和流量削峰的关键组件。Apache RocketMQ 作为一款高性能、高可靠的消息中间件,被广泛应用于各类互联网场景。其中,消息发送是最基础也是最重要的功能之一。本文将深入剖析 RocketMQ 中…...

BiliNote部署实践
开源地址: https://github.com/JefferyHcool/BiliNote 🚀 快速开始 1. 克隆仓库 git clone https://github.com/JefferyHcool/BiliNote.git cd BiliNote mv .env.example .env2. 启动后端(FastAPI) cd backend pip insta…...
deepseek问答记录:请讲解一下transformers.HfArgumentParser()
1. 核心概念: transformers.HfArgumentParser 是 Hugging Face Transformers 库提供的一个命令行参数解析器。它基于 Python 内置的 argparse 模块,但进行了专门增强,目的是为了更简单、更优雅地管理机器学习(尤其是 NLP 任务&am…...

bismark OT CTOT OB CTOB 以及mapping后的bam文件中的XG,XR列的含义
首先,OT,OB,CTOT,CTOB都是描述测序reads的,而不是描述参考基因组的。 bisul-fate建库会将DNA双链文库中非甲基化的C转化成U。转化结束后,被转化的U和互补链的G并不配对。此时正链(,…...
new语法
在C中,new 是用于动态内存分配的操作符,允许在运行时请求内存空间。以下是 new 的完整语法和用法说明: 1. 基本语法 1.1 单一对象分配 type* pointer new type(initializer);作用:分配一个 type 类型的对象,并返回…...
npm、yarn幽灵依赖问题
很好!我们来专门讲讲**幽灵依赖(Phantom Dependency)**是什么,以及为什么 pnpm 对这个问题非常严格。 👻 什么是幽灵依赖? 幽灵依赖(Phantom Dependency),指的是&#x…...

Android Native 之 adbd进程分析
目录 1、adbd守护进程 2、adbd权限降级 3、adbd命令解析 1)adb shell 2)adb root 3)adb reboot 4、案例 1)案例之实现不需要执行adb root命令自动具有root权限 2)案例之实现不需要RSA认证直接能够使用adb she…...

CAN通讯协议中各种参数解析
1.各种参数缩写 2.多帧传输时间参数解析 - Sender(左侧) 指的是 多帧数据的发送者,也就是: ECU(被测系统 / 响应方) - Receiver(右侧) 指的是 多帧数据的接收者,也就是…...

网络攻防技术三:网络脆弱性分析
文章目录 一、影响安全的因素二、计算机网络三、网络体系结构脆弱性1、因特网容易被攻击的特性 四、典型网络协议安全性分析(重要)1、IPv42、RIP(UDP)3、ICMP(UDP)4、ARP5、OSPF(IP数据报)6、BGP(TCP)7、UDP8、TCP9、DNS(UDP)10、…...

(八)登录认证与学生写作画像
本次将赵昱琨同学之前完成的学生写作画像与智能学习路径规划的后端与目前已有的后端框架进行整合。同时为了实现学生写作画像与智能学习路径规划,需要在之前简易的登录系统上进行重构,所以本次大规模重写了登录模块,同时发现很多过去冗余的代…...

Netty学习example示例
文章目录 simpleServer端NettyServerNettyServerHandler Client端NettyClientNettyClientHandler tcp(粘包和拆包)Server端NettyTcpServerNettyTcpServerHandler Client端NettyTcpClientNettyTcpClientHandler protocolcodecCustomMessageDecoderCustomM…...
几种常用的Agent的Prompt格式
一、基础框架范式(Google推荐标准) 1. 角色与职能定义 <Role_Definition> 你是“项目专家”(Project Pro),作为家居园艺零售商的首席AI助手,专注于家装改造领域。你的核心使命: 1. 协助…...
数据库运维管理系统在AI方向的实践
引言 关系型数据库(如MySQL、PostgreSQL、SQL Server、Oracle等)作为核心数据存储平台,承载着关键业务系统的运行。数据库的运维管理(DBA)工作变得愈发复杂和重要,涉及性能监控、故障诊断、容量规划、安全审计、自动化运维等多个方面。传统的数据库运维依赖人工经验,效…...

[RoarCTF 2019]Easy Calc
查看源代码 <!--Ive set up WAF to ensure security.--> <script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div …...

[Windows]在Win上安装bash和zsh - 一个脚本搞定
目录 前言安装步骤配置要求下载安装脚本启动程序 前言 Windows是一个很流行的系统, 但是在Windows上安装bash和zsh一直是一个让人头疼的问题. 本蛙特意打包了一个程序, 用于一站式解决这一类的问题. 安装步骤 配置要求 系统: Windows软件: Powershell 5.1或以上 下载安装…...
ubuntu系统上运行jar程序输出时间时区不对
springboot项目打包jar文件在ubuntu系统上运行,发现在系统和日志里面,显示和打印的当前时间时区都是UTC0,通过timedatectl命令设置系统时区为Asia/Shanghai,命令date -R发现系统已经修改成功,但是发现springboot仍然输…...
React 播客专栏 Vol.18|React 第二阶段复习 · 样式与 Hooks 全面整合
视频版 🎙 欢迎回到《前端达人 React播客书单》第 18 期。 今天,我们将对第二阶段的内容进行系统复盘,重点是两个关键词:样式 与 Hooks。 样式,决定组件“长什么样”Hooks,决定组件“怎么动起来” 我们不但…...
从认识AI开始-----解密LSTM:RNN的进化之路
前言 我在上一篇文章中介绍了 RNN,它是一个隐变量模型,主要通过隐藏状态连接时间序列,实现了序列信息的记忆与建模。然而,RNN在实践中面临严重的“梯度消失”与“长期依赖建模困难”问题: 难以捕捉相隔很远的时间步之…...

leetcode0513. 找树左下角的值-meidum
1 题目:找树左下角的值 官方标定难度:中 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7]…...

命令行式本地与服务器互传文件
文章目录 1. 背景2. 传输方式2.1 SCP 协议传输2.2 SFTP 协议传输 3. 注意 命令行式本地与服务器互传文件 1. 背景 多设备协同工作中,因操作系统的不同,我们经常需要将另外一个系统中的文件传输到本地PC进行浏览、编译。多设备文件互传,在嵌入…...
MPTCP 聚合吞吐
只破不立假把式,前面连续喷 MPTCP 是个错误,今天说说如何克服。 到底谁在阻碍 MPTCP 聚合吞吐一定要搞清楚,是算法硬伤,是数据不足。前文说过,将一个窗口内的数据多路径 spray 有损吞吐,想要聚合吞吐&…...