网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

Spring Security 6.x的SecurityFilterChain是如何巧妙串联过滤器链的?

GG网络技术分享 2026-04-17 08:11 1


Spring Security 6.x 过滤器链SecurityFilterChain是如何工作的

完成注册后 当Servlet容器启动时FilterChain就包含了DelegatingFilterProxy这个Filter,好家伙...。

Filter背景知识

主要原因是Spring Security底层依赖Servlet的过滤器技术,所以先简单地回顾一下相关背景知识。过滤器Filter是Servlet的标准组件, 自Servlet 2.3版本引入,主要作用是在Servlet实例接受到请求之前,以及返回响应之后这两个方向上进行动态拦截,这样就可以与Servlet主业务逻辑解耦,从而实现灵活性和可 性。利用这个特性可以实现很多功能,比方说身份认证、统一编码、数据加密解密、审计日志等等。啊,说起来我之前为了解决一个乱码问题搞了半天!真是头疼!

public class ExampleFilter implements Filter { … public void doFilter throws IOException, ServletException { doSomething; ; } …},求锤得锤。

SecurityFilterChain的必要性是什么?

那么SecurityFilterChain的必要性是什么?我们一层一层逐步说明这个问题:初学者经常会有一个疑问, 就是明明加一个Filter就可以解决的事, 不妨... 为什么搞得这么复杂?其实啊…这就像你盖房子一样,光有砖头不行啊!还需要水泥、钢筋、设计图纸…才能盖出一栋坚固漂亮的房子。同样的道理啦!

DelegatingFilterProxy:初始委派

交学费了。 在非Spring Boot环境可以通过在web.xml中进行注册配置如下:

 springSecurityFilterChain  springSecurityFilterChain /*

委派过程比较简单。DelegatingFilterProxy#doFilter方法的源码, 当请求进入doFilter之后先说说调用initDelegate方法。这里利用Spring的ApplicationContext#getBean方法获取名为“springSecurityFilterChain“的bean对象——即FilterChainProxy。 等着瞧。 然后调用其doFilter方法。这样就完成了委派调用!哎呀…我记得当时debug的时候卡了好久才搞明白这个地方。

FilterChainProxy:核心代理

@Bean // "springSecurityFilterChain"public Filter springSecurityFilterChain throws Exception { ... return ;}

嚯... 产品 价格 特点 防火墙 ¥500 保护网络平安 杀毒软件 ¥100 清除病毒木马

SecurityFilterChain:多链选择

我跟你交个底... @Overridepublic void doFilter throws IOException, ServletException { if { ; return; 拜托大家... } ++; Filter nextFilter = ; if ) { String name = .getSimpleName; ", name, , )); } ;}private void doFilterInternal throws IOException, ServletException { FirewalledRequest firewallRequest = request); HttpServ 我们都经历过... letResponse firewallResponse = response); List filters = getFilters; // 重点关注这个方法 if == 0) { ... ; .doFilter; return;} ... }严格来说呢!到头来施行doFilter的并不是SecuritFilterChain! FilterChainProxy内部维护了一个SecurityFilterChain的List列表。在调用doFilter方法时呢会根据SecurityFilt 我明白了。 erChain#match方法匹配的后来啊决定选择某一个SecurityFilterChain 然后取出该SecurityFilterChain所有的Filter用其构造一个VirtualFilterChain!这才是实际意义上过滤器链施行的入口!文章浏览阅读646次。.

VirtualFilterChain:职责链模式

其中NLš••社随中维护了一个所有已注册的过滤器数组它组成了真正的“过滤器链”,下面是VirtualFilteChain的部分源码:创建出一个VirtualFilteChain实例然后调用VirtualFilteChain#doFilter方法这时会从数组中取出下一个过滤器并调用FiIter#doFiIter 方法在方法末尾又会将请求继续交由 VirtualFilteChain处理如此往复从而实现职责链模式的方式,不如...。. VirtualFilteChain 的实现也并不复杂 其 doFiIter 方法源码如下原理和servlet 的 FilteChain 的实现类 ApplicationFilteChain 基本类似不过当所有 FiIter 都施行完之后 它会交给original Chain继续施行即回到servlet 的 Filtechain 上文提到如果要打断点 debug 这里是一个比较好的位置可以看到 Spring Security 中定义各个 FiIter 施行的过程 . 再说说 再结合 Spring Security官方文档图示 可以更好地理解整个施行流程 . private void internalDo Filter {Applicatio nFiiter Config fiiterConfigfiiterspos++try{Fitter fiiter={...}else{{...}return;} try{;}catch{...finally{...}} . 让我们一起... . 希望这篇文章能够帮助大家更好地理解 Spring Security 6.x 中 SecurityFiltechain的工作原理哦~ 如果有任何问题欢迎留言讨论! 再说说祝大家编程愉快!.,YYDS...


提交需求或反馈

Demand feedback