过滤器链加载原理

简介: 通过前文十五个过滤器的解析,我们揭开了Spring Security的神秘面纱。虽未显式配置,但这些过滤器由DelegatingFilterProxy通过名称springSecurityFilterChain自动加载,最终指向FilterChainProxy,并封装于DefaultSecurityFilterChain中执行。底层原理明晰后,方可更好实现自定义认证页面。

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

相关文章
|
20小时前
|
关系型数据库 MySQL Java
开发环境搭建
工欲善其事,必先利其器。学习前请确保电脑内存16G以上(建议32G),推荐使用便携显示器分屏开发以提升效率。下载并配置虚拟机(IP:192.168.101.68)、安装VMware、FinalShell远程连接,导入CentOS 7系统。通过Gitee Fork黑马商城项目,配置Maven、Git、IDEA及Nginx,导入数据库hmall.sql,启动服务后访问本地门户登录测试,完成环境搭建。
|
19小时前
|
SQL Java 数据库连接
Activity代码实现
本教程通过创建BPMN流程、部署定义、启动实例、查询与完成任务,演示Activiti工作流引擎的基本使用。涵盖流程定义部署、任务操作及数据库表变化,帮助快速掌握工作流开发核心步骤。
|
19小时前
|
存储 API 数据库
Activiti框架拓展
Activiti表结构以ACT_开头,分五类:ACT_RE_*存流程定义等静态资源;ACT_RU_*存运行时实例、任务等数据;ACT_HI_*存历史记录;ACT_ID_*管理用户组信息;ACT_GE_*处理通用数据。各表协同支持流程引擎高效运作。
|
19小时前
|
存储 JSON Dubbo
Soul数据库设计
本插件采用数据库设计,存储插件、选择器、规则及其关联关系。核心四表:plugin、selector、rule、condition,体现Soul三大核心:插件、规则、选择器。支持多层级匹配,适用于Dubbo、SpringCloud等协议,灵活配置路由与处理逻辑。(238字)
|
19小时前
|
Java 关系型数据库 MySQL
Activiti工程搭建
本文介绍如何在Idea中创建Maven工程并安装Activiti插件,包含插件下载、版本兼容性修复及验证步骤,同时引入SpringBoot、MySQL、MyBatis与Activiti相关依赖,配置数据源与流程引擎,完成基础环境搭建,适用于工作流项目快速开发。
|
19小时前
|
缓存 Dubbo Java
什么是API网关
API网关是一种架构思想,用于统一接收外部请求并转发至后端服务,实现协议转换、路由、鉴权、限流、熔断降级等功能。通过网关,可简化客户端调用,提升系统安全性与可维护性。常见实现如Kong、Zuul、Spring Cloud Gateway等,广泛应用于微服务架构中,支持异步处理、全链路监控与多维度流量控制。
|
19小时前
|
缓存 前端开发 安全
数据同步原理
Soul 网关通过推拉模式从配置服务同步数据,支持 WebSocket、HTTP 长轮询和 Zookeeper 三种方式。1.x 版本基于 Zookeeper 推送,2.x 版本默认采用 HTTP 长轮询(借鉴 Apollo/Nacos),实现秒级更新。管理后台变更配置后,通过 EventPublisher 发布事件,根据 sync.strategy 策略将变更推送给网关并更新本地缓存。WebSocket 主动推送全量+增量数据;Zookeeper 利用 watch 机制监听节点变化;HTTP 长轮询则通过异步 Servlet + BlockingQueue 实现准实时同步,保障配置一致性。
|
19小时前
|
安全 Java 应用服务中间件
实现权限管理的技术
权限管理技术选型需综合考量。主流方案如Apache Shiro轻量易用,但安全维护弱;Spring Security功能强大、防护全面,但配置复杂;自定义ACL契合业务但通用性差。多数技术基于ACL或RBAC模型封装,选型应结合项目实际,权衡优劣,避免过度设计。
|
19小时前
|
Dubbo JavaScript 前端开发
Soul网关接入与验证
本文介绍如何将服务提供者与消费者接入Soul网关,涵盖pom依赖、Controller注解(@SoulSpringMvcClient)、配置文件参数说明(如adminUrl、contextPath、full模式等),并支持HTTP与Dubbo双协议。通过zookeeper注册,结合soul-admin与soul-bootstrap启动,完成服务注册与网关路由验证,附完整代码与测试示例。