过滤器链加载原理

简介: 通过前文介绍的十五个过滤器,我们了解了Spring Security的工作流程。本文深入源码,解析DelegatingFilterProxy如何加载springSecurityFilterChain,进而引出FilterChainProxy与SecurityFilterChain的实现机制,揭示过滤器链自动装配原理,为自定义认证页面奠定基础。(238字)

通过前面十五个过滤器功能的介绍,对于SpringSecurity简单入门中的疑惑是不是在心中已经有了答案了呀? 但新的问题来了!我们并没有配置这些过滤器啊?它们都是怎么被加载出来的?
1-DelegatingFilterProxy
我们在web.xml中配置了一个名称为springSecurityFilterChain的过滤器DelegatingFilterProxy,接下我直接对 DelegatingFilterProxy源码里重要代码进行说明,其中删减掉了一些不重要的代码,大家注意我写的注释就行了!
第二步debug结果如下:

由此可知,DelegatingFilterProxy通过springSecurityFilterChain这个名称,得到了一个FilterChainProxy过滤器, 最终在第三步执行了这个过滤器。
2-FilterChainProxy
注意代码注释!
第二步debug结果如下图所示,惊不惊喜?十五个过滤器都在这里了!
再看第三步,怀疑这么久!原来这些过滤器还真是都被封装进SecurityFilterChain中了。
3-SecurityFilterChain
最后看SecurityFilterChain,这是个接口,实现类也只有一个,这才是web.xml中配置的过滤器链对象!
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//接口
public interface SecurityFilterChain {
boolean matches(HttpServletRequest var1);
List getFilters();
}

//实现类
public final class DefaultSecurityFilterChain implements SecurityFilterChain {

private static final Log logger = LogFactory.getLog(DefaultSecurityFilterChain.class);
private final RequestMatcher requestMatcher;
private final List<Filter> filters;

public DefaultSecurityFilterChain(RequestMatcher requestMatcher,
                                  Filter... filters) {
    this(requestMatcher, Arrays.asList(filters));
}

public DefaultSecurityFilterChain(RequestMatcher requestMatcher, 
                                  List<Filter> filters) {
    logger.info("Creating filter chain: " + requestMatcher + ", " + filters);
    this.requestMatcher = requestMatcher;
    this.filters = new ArrayList(filters);
}

public RequestMatcher getRequestMatcher() {
    return this.requestMatcher;
}

public List<Filter> getFilters() {
    return this.filters;
}

public boolean matches(HttpServletRequest request) {
    return this.requestMatcher.matches(request);
}

public String toString() {
    return "[ " + this.requestMatcher + ", " + this.filters + "]";
}

}
总结:通过此章节,我们对SpringSecurity工作原理有了一定的认识。但理论千万条,功能第一条,探寻底层,是为了更好的使用框架。 那么,言归正传!到底如何使用自己的页面来实现SpringSecurity的认证操作呢?要完成此功能,首先要有一套自己的页面!

相关文章
|
5月前
|
设计模式 Java 程序员
推荐书籍
推荐多本Java经典书籍:《Head First Java》适合入门,《Java核心技术》深入巩固基础,《Java编程思想》整合设计模式,适合进阶。并发方面有《Java并发编程之美》等,JVM推荐《深入理解Java虚拟机》与《实战JVM》。体系全面,适合不同阶段学习。
|
5月前
|
负载均衡 算法 Java
微服务篇
SpringBoot核心原理是自动装配,通过@SpringBootApplication注解实现配置类、组件扫描与自动配置。其启动流程包括环境初始化、上下文创建与自动化配置。常用起步依赖如web、redis等;支持properties、YAML等配置文件,后加载的覆盖先加载的。项目通过Feign、Ribbon实现服务通信与负载均衡,使用Nacos做注册与配置中心,Sentinel或Hystrix实现限流熔断,Gateway实现网关限流与CORS跨域控制,结合Spring Cloud五大组件构建微服务架构。
|
5月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑与代码解耦。结合实体别名、接口规则定义及脚本化表达式,实现动态计算与判断,如用户年龄判断、BMI计算等。支持AST语法树解析与上下文绑定,提供灵活的二次扩展能力,适用于复杂业务场景的延迟执行与缓存优化。
|
5月前
|
人工智能 自动驾驶 安全
阿里云无影云电脑图形工作站:RTX 5880专业级显卡,优势、价格及性能对比
阿里云无影云电脑企业版搭载RTX 5880专业显卡,基于Ada Lovelace架构,配备48GB显存,性能强劲,支持渲染、工业设计、AI推理等场景。提供多种规格与灵活付费方式,安全可靠,性价比高,适用于多行业高端图形与计算需求。
|
5月前
|
搜索推荐 安全 BI
阿里云邮件推送支持哪些功能?附邮件群发费用价格表
阿里云邮件推送(DirectMail)是高效稳定的电子邮件群发服务,支持事务通知、批量营销等场景,具备高到达率与强系统稳定性。提供控制台、API、SMTP多种接入方式,无需自建服务器,开通即用。支持邮件模板、列表管理、个性化定制及多维度数据统计,助力企业精准触达用户。价格透明,按量付费,详情见官方页面。
409 5
|
5月前
|
人工智能 监控 Cloud Native
架构级拆解:AI数字人与数字员工的核心差异,玄晶引擎云原生实践启示
本文揭示AI数字人与AI数字员工的本质差异:前者仅为可视化交互组件,后者是具备业务闭环能力的云原生智能体。基于玄晶引擎与阿里云PAI实测,从架构、系统对接到弹性部署,解析如何实现“交互→决策→执行”全流程自动化,助力开发者精准选型,避免落地陷阱。
445 12
|
5月前
|
JSON 监控 API
1688搜索店铺列表API使用指南
1688开放平台提供搜索店铺列表API,支持按关键词、行业、地区等条件检索店铺信息,适用于市场调研、竞品监控等场景。本文详解接口摘要、参数说明及Python调用示例,助力开发者高效接入。
|
4月前
|
存储 Web App开发 编解码
Playwright截图与录屏功能深度教程
Playwright截图与录屏功能远超想象,本文分享实战中的隐藏技巧:从稳定截图、元素精确定位、全页滚动截长图,到多设备适配、视频录制优化及自动重试机制。结合懒加载处理、截图对比测试与错误兜底策略,助你构建高效、可靠的自动化视觉验证体系,真正提升测试质量与调试效率。
|
6月前
|
监控 物联网 5G
工厂车辆定位技术从原理到应用全解析
工厂车辆定位技术融合卫星、5G、UWB等多元方案,实现室内外高精度定位,赋能物流调度、安全监控与停车场管理,提升运营效率与安全性,助力工厂智能化升级。
工厂车辆定位技术从原理到应用全解析