2.过滤器链加载原理

简介: 通过分析DelegatingFilterProxy、FilterChainProxy与SecurityFilterChain,揭示了Spring Security中15个过滤器的加载机制。虽未显式配置,实则由框架自动组装。底层原理明晰后,方可更好自定义登录页面,实现认证功能。

通过前面十五个过滤器功能的介绍,对于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的认证操作呢?要完成此功能,首先要有一套自己的页面!

相关文章
|
Java
SpringBoot实现文件上传接口
文件上传是很多业务场景需要实现的功能,今天就简单以Springboot框架为基础实现文件上传的接口。
2877 0
SpringBoot实现文件上传接口
|
弹性计算 Java Linux
手把手教你把Springboot项目部署到阿里云教程
手把手教你把Springboot项目部署到阿里云教程成功连接远程云服务器和配置阿里云安全组
2894 1
|
7月前
|
消息中间件 Shell Linux
RabbitMQ部署指南
本文介绍RabbitMQ在CentOS7下基于Docker的单机与集群部署方案,涵盖镜像安装、DelayExchange插件配置、普通模式与镜像模式集群搭建,并详解仲裁队列使用及集群扩容方法,助力实现高可用消息队列服务。
|
7月前
|
关系型数据库 应用服务中间件 Nacos
Nacos配置中心
本章详解Nacos配置中心实战:实现微服务配置统一管理,支持热更新、配置共享与优先级控制,并搭建高可用集群,提升系统稳定性。
|
7月前
|
负载均衡 Java Nacos
Gateway服务网关
网关是微服务的统一入口,实现请求路由、权限控制与限流。基于Spring Cloud Gateway可快速搭建高性能网关,支持断言与过滤器灵活配置,并解决跨域问题,提升系统安全性和可维护性。
|
7月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
MyBatisPlus是MyBatis的增强框架,简化单表CRUD操作,内置分页、条件构造器、代码生成等功能,支持逻辑删除、枚举处理与JSON字段映射,提升开发效率。
|
7月前
|
SQL 容灾 Nacos
Seata的部署和集成
本文介绍Seata分布式事务框架的部署与微服务集成。首先下载并解压Seata Server,修改配置文件application.yml,并在Nacos中配置seataServer.properties及数据库信息。创建seata数据库并运行SQL脚本初始化事务表。启动TC服务后,注册至Nacos。各微服务引入Seata依赖,配置application.yml连接TC。为实现高可用,搭建多节点TC集群,通过Nacos统一管理事务组映射,实现异地容灾与动态切换。微服务从Nacos读取client.properties,灵活绑定TC集群,提升系统稳定性与可维护性。(238字)
|
7月前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用(读完就懂)
Thread.Sleep(0)并非无用,它会触发操作系统立即重新进行CPU竞争,让其他线程获得执行机会,避免界面假死。而Sleep(1000)也不保证精确唤醒,因线程调度受优先级和系统负载影响。理解其原理有助于编写更高效的多线程程序。
|
7月前
|
消息中间件 存储 Java
消息中间件RabbitMQ(高级)
本节深入探讨RabbitMQ在生产环境中的高可用与可靠性问题,涵盖消息确认、持久化、消费者重试、死信队列、延迟消息、惰性队列及集群搭建。通过实战案例实现消息不丢失、延迟处理与高并发支撑,全面提升系统稳定性与可扩展性。(239字)
|
7月前
|
存储 缓存 算法
零拷贝
实现文件传输时,传统方式需频繁系统调用与内存拷贝,导致大量上下文切换和性能损耗。零拷贝技术通过减少用户态与内核态切换、避免重复数据拷贝,显著提升性能。结合PageCache可优化小文件读取,而大文件场景则宜用异步IO+直接IO,避免缓存污染,兼顾效率与并发。