DelegatingFilterProxy

简介: 本文解析Spring Security核心过滤器DelegatingFilterProxy源码,重点说明其如何通过web.xml配置的springSecurityFilterChain名称,动态获取FilterChainProxy并执行过滤链,揭示Spring安全过滤机制的底层实现原理。

我们在web.xml中配置了一个名称为springSecurityFilterChain的过滤器DelegatingFilterProxy,接下我直接对 DelegatingFilterProxy源码里重要代码进行说明,其中删减掉了一些不重要的代码,大家注意我写的注释就行了!

public class DelegatingFilterProxy extends GenericFilterBean {
    @Nullable 
    private String contextAttribute; 
    @Nullable 
    private WebApplicationContext webApplicationContext; 
    @Nullable 
    private String targetBeanName; 
    private boolean targetFilterLifecycle; 
    @Nullable 
    private volatile Filter delegate;//注:这个过滤器才是真正加载的过滤器 
    private final Object delegateMonitor; 
    //注:doFilter才是过滤器的入口,直接从这看! 
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain 
                         filterChain) throws ServletException, IOException { 
        Filter delegateToUse = this.delegate; 
        if (delegateToUse == null) { 
            synchronized(this.delegateMonitor) { 
                delegateToUse = this.delegate; 
                if (delegateToUse == null) { 
                    WebApplicationContext wac = this.findWebApplicationContext(); 
                    if (wac == null) { 
                        throw new IllegalStateException("No WebApplicationContext found: no 
                        ContextLoaderListener or DispatcherServlet registered?"); 
                    } 
                    //第一步:doFilter中最重要的一步,初始化上面私有过滤器属性delegate 
                    delegateToUse = this.initDelegate(wac); 
                } 
                this.delegate = delegateToUse; 
            } 
        } 
        //第三步:执行FilterChainProxy过滤器 
        this.invokeDelegate(delegateToUse, request, response, filterChain); 
    } 
    //第二步:直接看最终加载的过滤器到底是谁 
    protected Filter initDelegate(WebApplicationContext wac) throws ServletException { 
        //debug得知targetBeanName为:springSecurityFilterChain 
        String targetBeanName = this.getTargetBeanName(); 
        Assert.state(targetBeanName != null, "No target bean name set"); 
        //debug得知delegate对象为:FilterChainProxy 
        Filter delegate = (Filter)wac.getBean(targetBeanName, Filter.class); 
        if (this.isTargetFilterLifecycle()) { 
            delegate.init(this.getFilterConfig()); 
      } 
    return delegate; 
    }
}

第二步debug结果如下:

由此可知,DelegatingFilterProxy通过springSecurityFilterChain这个名称,得到了一个FilterChainProxy过滤器, 最终在第三步执行了这个过滤器。

相关文章
|
安全 Java 数据库
Spring Security 实战指南:从入门到精通
本文详细介绍了Spring Security在Java Web项目中的应用,涵盖登录、权限控制与安全防护等功能。通过Filter Chain过滤器链实现请求拦截与认证授权,核心组件包括AuthenticationProvider和UserDetailsService,负责用户信息加载与密码验证。文章还解析了项目结构,如SecurityConfig配置类、User实体类及自定义登录逻辑,并探讨了Method-Level Security、CSRF防护、Remember-Me等进阶功能。最后总结了Spring Security的核心机制与常见配置,帮助开发者构建健壮的安全系统。
2059 0
|
3月前
|
安全 JavaScript Java
若依后台权限核心:Spring Security 认证授权详解
若依(RuoYi)框架整合 Spring Security 的具体实现方式,我会从核心原理、整合步骤、关键配置、实战示例四个维度,结合若依前后端分离版(Spring Boot + Vue)的特点,给出可直接落地的整合方案,帮你理解若依是如何基于 Spring Security 实现权限管控
296 4
|
4月前
|
运维 安全 数据可视化
Nacos 生产级安全实践:精细化鉴权、灰度平滑过渡与全量操作审计
在保障安全性的同时,提供平滑的过渡和直观的可视化能力。
254 51
|
7月前
|
缓存 NoSQL 数据库
从0到1构建高并发在线教育网站:架构设计与实战破局
引言:为什么是在线教育?为什么是高并发? 近年来,在线教育经历了爆发式增长。其技术核心,就是一个典型的内容型+交互型网站。它既有电商秒杀般的课程购买场景,又有流媒体般的视频直播/点播需求,同时还包含了社区论坛般的评论、问答互动。 这种业务复杂性,使得在线教育网站成为一个绝佳的全栈实践项目。而其中最大的技术挑战,往往来自于 “高并发” ——当一门热门课程发布、一位名师开讲直播时,瞬间涌入的流量如何平稳承接?这就是我们今天要攻克的堡垒。
774 84
|
5月前
|
消息中间件 人工智能 NoSQL
AgentScope x RocketMQ:打造企业级高可靠 A2A 智能体通信基座
Apache RocketMQ 推出轻量级通信模型 LiteTopic,专为 AI 场景设计,结合 A2A 协议与 AgentScope 框架,实现多智能体高效、可靠协作,支持海量会话持久化、断点续传与动态订阅,重塑企业级 AI 应用架构。
336 28
|
5月前
|
监控 Java C语言
揭开 Java 容器“消失的内存”之谜:云监控 2.0 SysOM 诊断实践
本文介绍云原生环境下Java应用内存超限问题的诊断与治理,聚焦容器化后常见的JVM堆外内存、JNI内存泄漏、LIBC分配器特性及Linux透明大页等导致OOM的根源,结合阿里云SysOM系统诊断工具,通过真实案例详解如何实现从应用到系统的全链路内存分析,精准定位“消失的内存”,提升资源利用率与稳定性。
302 19
|
5月前
|
存储 缓存 安全
常用过滤器介绍
本文介绍了Spring Security中的15个核心过滤器,涵盖安全上下文管理、认证授权、会话控制、异常处理等关键流程。如SecurityContextPersistenceFilter负责上下文持久化,UsernamePasswordAuthenticationFilter处理登录认证,CsrfFilter防范跨站请求伪造攻击,FilterSecurityInterceptor执行权限校验,全面解析各过滤器作用及在安全链中的职责分工。
|
5月前
|
NoSQL Linux Shell
2-MongoDB单机部署
本文介绍了MongoDB在Windows和Linux系统下的安装、配置与启动方法,包括下载地址、版本选择、解压安装、命令行及配置文件启动方式,并详细说明了如何通过Shell和图形化工具Compass连接数据库。同时提供常见问题解决方案及附件中的各环境安装包链接,便于快速部署使用。
131 0
|
5月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
MyBatisPlus是基于MyBatis的增强ORM框架,简化单表增删改查操作。通过继承BaseMapper即可实现CRUD,支持注解映射与全局配置,提供QueryWrapper、UpdateWrapper等条件构造器,灵活构建查询条件,并可结合自定义SQL满足复杂业务需求,大幅提升开发效率。
|
9月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。