Spring Security过滤器链加载原理|学习笔记

简介: 快速学习 Spring Security 过滤器链加载原理

开发者学堂课程【Spring Security知识精讲与实战演示(一)Spring Security过滤器链加载原理】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/730/detail/13032


Spring Security过滤器链加载原理

 

过滤器链加载原理

Spring Security 常用的十五个过滤器,但是我们并没有在项目中配置如此多的过滤器,这些过滤器从哪来的呢?

在代码 web.xml 中只配置了如下:

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>

<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

那么多个过滤器从哪来呢?点击 DelegatingFilterProxy,点进后是一个过滤器,查找doFilter,核心代码为 delegateToUse = this.initDelegate(wac);经过一系列if判断,然后进行初始化 Delegate,然后this.invokeDelegate(delegateToUse,request,response,filterChain)执行,让过滤器起作用,真正封装过滤器、过滤器加载是在initDelegate中。点击initDelegate 进入查看真正封装代码:

protected Filter initDelegate(WebApplicationContext wac)throws ServletException{

String targetBeanName = this.getTargetBeanName() ;

Assert.state( expression: targetBeanName != null, message:"No target bean name set");

Filter delegate = (Filter)wac.getBean(targetBeanName,Filter.class) ;

if (this.isTargetFilterLifecycle()){

delegate.init(this.getFilterConfig());

}

可以先对第二行进行断点,注意这些过滤器必须在项目启动时加载,点击debug关闭。

显示:targetBeanName 是目标对应名称, targetBeanName=”springSecurityFilterChain”。

getBean是通过id取名称即通过对象的id获取对象,所以 targetBeanName 不能乱写。targetBeanName 通过名字 springSecurityFilterChain 去获取对象。

控制台中再点击下一步查看 delegate,显示delegate={FilterChainProxy@4684}”FilterChainProxy[Filter Chains:[[any request,[org.springframework.security.web.context.SecurityContext...]]”

并不是有关十五个过滤器,所以继续向下查看

delegate 是得到对象后返回,但是返回的不是 springSecurityFilterChain,所以追踪 springSecurityFilterChain 对象继续寻找。

刚才讲解了 DelegatingFilterProxy,查找到 FilterChainProxy。所以在代码中查找FilterChainProxy,找到 FilterChainProxy.class中的FilterChainProxy,还是过滤器,所以继续找dofilter。在寻找之前会发现存在SecurityFilterChain,与上述的springSecurityFilterChain接近。找到doFilter,看到代码中无论if或是else都执行doFilterInternal,点进doFilterInternal。不能看懂原理继续打断点,点debug,代码中存在很多过滤器,查看List<Filter>filters = this.getFilters((HttpServletRequest)fwRequest)是否是我们需要的过滤器,结果显示

image.png

再往下可以看到显示讲解的十五个过滤器,所以理解其中的过滤器链是FilterChainProxy 在封装,但是还不能确定过滤器链。

继续在 debug中查看,已经找到了十五个过滤器,之后运行了getFilters,再点进getFilters,发现过滤器链确实存在 SecurityFilterChain中。点进SecurityFilterChain,可以查看它的实现类只有一个 DefaultSecurityfFilterChain。

总结getFilters放置过滤器链,配置 springSecurityFilterChain,实际上过滤器链在SecurityFilterChain中进行存放,实现类为 DefaultSecurityfFilterChain。即springSecurity中的过滤器链中的过滤器由对象SecurityFilterChain封装。

以上就是过滤器链加载的原理。

相关文章
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
3月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
3月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
518 22
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1396 0
|
2月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
2月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
443 2
|
4月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
7月前
|
前端开发 Java 数据库连接
Spring核心原理剖析与解说
每个部分都是将一种巨大并且复杂的技术理念传达为更易于使用的接口,而这就是Spring的价值所在,它能让你专注于开发你的应用,而不必从头开始设计每一部分。
223 32
|
5月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
197 0

热门文章

最新文章