过滤器链加载原理

简介: 通过前文介绍,我们了解了Spring Security的15个过滤器作用。但这些未显式配置的过滤器如何加载?原来,web.xml中配置的DelegatingFilterProxy通过名称“springSecurityFilterChain”找到FilterChainProxy,进而获取封装好的SecurityFilterChain,其中包含全部过滤器。最终,DefaultSecurityFilterChain实现类将请求匹配并执行对应过滤链。底层原理明晰后,方可更好自定义认证页面,实现个性化安全控制。

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

由此可知,DelegatingFilterProxy通过springSecurityFilterChain这个名称,得到了一个FilterChainProxy过滤器, 最终在第三步执行了这个过滤器。
2-FilterChainProxy
注意代码注释!
第二步debug结果如下图所示,惊不惊喜?十五个过滤器都在这里了!
再看第三步,怀疑这么久!原来这些过滤器还真是都被封装进SecurityFilterChain中了。
3-SecurityFilterChain
最后看SecurityFilterChain,这是个接口,实现类也只有一个,这才是web.xml中配置的过滤器链对象!
Java
运行代码
复制代码

//接口
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的认证操作呢?要完成此功能,首先要有一套自己的页面!

相关文章
|
4月前
|
JSON Java 数据格式
SpringBoot使用汇总
本课程系统讲解Spring Boot核心知识,涵盖环境搭建、JSON处理、日志配置、全局异常处理、AOP切面编程及MyBatis、Redis等主流框架集成,并结合实际项目搭建完整开发架构,助你快速掌握微服务开发技能。
|
4月前
|
人工智能 JSON 数据挖掘
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用的两大关键技术。前者是跨模型的标准协议,实现多工具动态集成;后者是模型调用外部功能的机制。MCP构建通用连接桥梁,支持跨平台、热插拔与细粒度管控,适用于复杂企业场景;Function Call则轻量直接,适合单模型快速开发。二者可协同工作:模型通过Function Call解析意图,转为MCP标准请求调用工具,兼顾灵活性与扩展性。未来将趋向融合,形成“解析-传输-执行”分层架构,推动AI应用标准化发展。
|
4月前
|
监控 Java 测试技术
OOM排查之路:一次曲折的线上故障复盘
本文记录了一次线上服务因Paimon数据湖与RocksDB集成引发的三次内存溢出(OOM)故障排查全过程。通过MAT、NMT、async-profiler等工具,结合监控分析与专家协作,最终定位到RocksDB通过JNI申请的堆外内存未释放是根源。团队通过架构优化,改由Flink统一写入Paimon,彻底解决问题。文章系统梳理了排查思路与工具使用,为类似技术栈提供宝贵经验。
|
4月前
|
负载均衡 算法 搜索推荐
重复性工作中如何培养匠心
本文探讨在互联网低增长周期下,如何在重复性工作中培养“匠心”。通过分析结果价值、过程贡献度与可预测性三个维度,指出即便工作看似重复,仍可通过创新、沉淀与自我突破挖掘成长空间,实现从熟练到卓越的跃迁。
|
4月前
|
安全
通过述职发现自己"变"了
本文从技术研发视角解读述职的本质,强调其不仅是总结工作,更是展现个人成长与价值创造的过程。通过结构化思考、快慢思维结合、积极主动、以终为始等做事方法,提升执行力与影响力,实现有质量的结果输出。同时倡导深度反思与有效沟通,借事修人,推动持续成长。
|
4月前
|
前端开发 API 数据库
如何写好一篇技术方案
本文档为项目需求说明模板,涵盖背景目标、功能模块、流程图、UML设计、API与数据库设计等内容,支持表格、思维导图、时序图等多种视图,便于团队协作与排期管理,提升产研效率。
|
4月前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示对象协作过程,强调交互时序,直观表达并发行为。主要元素包括角色、对象、生命线、控制焦点和各类消息,支持同步、异步与返回消息,适用于系统动态建模。
|
4月前
|
数据可视化 开发者
业务架构图
业务架构图是将现实业务抽象为分层、分模块、分功能的可视化工具,旨在清晰表达业务层级与关系。它淡化技术细节,聚焦业务逻辑,帮助客户理解服务全貌,助力开发者掌握系统结构,提升协作效率与系统可扩展性。

热门文章

最新文章