2.过滤器链加载原理

简介: scsacasas

通过前面十五个过滤器功能的介绍,对于SpringSecurity简单入门中的疑惑是不是在心中已经有了答案了呀? 但新的问题来了!我们并没有配置这些过滤器啊?它们都是怎么被加载出来的?

1-DelegatingFilterProxy
我们在web.xml中配置了一个名称为springSecurityFilterChain的过滤器DelegatingFilterProxy,接下我直接对 DelegatingFilterProxy源码里重要代码进行说明,其中删减掉了一些不重要的代码,大家注意我写的注释就行了!
第二步debug结果如下:

DELEGATE=(FILERCHAINPROY@4132)FLTERCHAINPROX[FLTERCHAINS:[LARYREQUESTLORGSPRINGFRAMEVORKSECURITYWVEB.CONTEXT.

AE=(XMLLEBAPPLICATIBNCONTEXT@4088ROOTWEBAPPLICATIONCONTEXT,STARTEDONTUEJUN2513:52

STRINGTARGETBEANLNAMETHIS.GETLARGETBEANLAME()

TARGETBEANNAME"SPRINGSECURITYFILTERCHQIN"

MESSAGE:NOTARGETBEANNAMESET

ATE.INIT(THIS.GETFILTERCONFIGO)):

ARGETBEANNAME:SPRINGSECUXITYHILTERCH

(FILTER)WAC.GETBEAN(TARGETBEANLNAME,H

TNIS.ISTARGETFILTERLIFECYCLE

NITDELEGATEWEBAPPLICAT1ON

AME.FILTER,CLASS):DELEGATE:FILTERCH

DELEGATINGFILTERPROXY>

ETHIS三DELEGATINGFILTERPIO>

EXPRESSION:TARGETBEAAME

TOMCATCATALINALOG

>INITDEEHATE0

SSERVLETEXCEPTIO

FILTERDLELEGATE

VARIABLES

PROTECTEDHILT

上兰土百国器

TERPTOXY@4087

DELEGATE.INI

ASSERT.STATE(EX

THROWSS

WAC:ROO

三仑

INQFR

XTWAC)

.WEE

AME!ENU1L

RINAT

WAE..NRI1TARCHAI


由此可知,DelegatingFilterProxy通过springSecurityFilterChain这个名称,得到了一个FilterChainProxy过滤器, 最终在第三步执行了这个过滤器。
2-FilterChainProxy
注意代码注释!
第二步debug结果如下图所示,惊不惊喜?十五个过滤器都在这里了!

IF(FI1TERS!=NU1&&FILTERS.SIZE0)!E0)FILTERS:S

5三USERNAMEPASSWORDAUTHENTICATIONFILTER@4255

11={ANONYMOUSAUTHENTICATIONFILTER@4261)

7=DEFAULTLOAOUTPAGEGENERATINGFILTER@4257

1=WEBASYNCMANAGERLNTEGRATIONFILTER@4251)

13=EXCEPTIONTRANSLATIONFILTER@4263)

10=(SECURITYCONTEXTHOLDERAWAREREQUESTFILTER@4260)

三土土工国明

三9=(REQUESTCACHEAWAREFILTER@4259)

LIST<FILTER>FILTERS

6=DEFAULTLOGINPAGEGENERATINGFILTER@4256

12三(SESSIONMANAGEMENTFILTER@4262}

WRESPONSE三FIREWALLEDRESPONSE@4222)

ETHIS.GETFILTER

FILTERS=(ARRAYLIST@4245)SIZE三15

三14=FILTERSECURITYLNTERCEPTOR@4264)

三0=(SECURITYCONTEXTPERSISTENCEFILTER@4250

8=BASICAUTHENTICATIONFILTER@4258

三3-CSRFILTER@4253)

一4-LOGOUTFILTER@4254

三2-HEADERWRITERFILTER@4252

FI1TERS:

ATALINALOG

Y>DOFILTERLNTERNA

SIZE-15

PROXY

SGETHILTERS((HTTPSERVLETREQUEST)FWREQUIEST);

ABLES

IF(FI1TERS


再看第三步,怀疑这么久!原来这些过滤器还真是都被封装进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<Filter> 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的认证操作呢?要完成此功能,首先要有一套自己的页面!

若有收获,就点个赞吧


相关文章
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
2121 0
SpringBoot+Mybatis-Plus+PageHelper分页+多条件查询
SpringBoot+Mybatis-Plus+PageHelper分页+多条件查询
981 0
swagger3.0中,如何在@GetMapping中写多个参数,包括数组类型的参数
swagger3.0中,如何在@GetMapping中写多个参数,包括数组类型的参数
932 0
|
6月前
|
SQL Java 数据库
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
本文详解Spring Boot集成MyBatis-Plus全流程:从依赖引入、数据源配置、Mapper扫描到分页/乐观锁/逻辑删除等核心插件配置;涵盖BaseMapper基础CRUD、LambdaQueryWrapper条件查询、Service层封装、自定义XML多表关联及批量优化实践,附完整可运行示例。
1223 1
|
9月前
|
安全 Java 开发工具
工程搭建与验证
本文介绍如何使用阿里云脚手架快速搭建Spring Boot工程,并整合Spring Security实现基础安全控制。包含工程创建、代码导入、Web依赖配置、访问接口开发及Security默认登录验证,附完整代码仓库地址。
|
9月前
|
JSON 安全 Java
SpringBoot.鉴权
本文介绍如何在Spring Boot项目中结合JWT与Spring Security实现安全鉴权。涵盖Token生成与验证、自定义认证流程、角色权限控制(RBAC),并通过过滤器实现登录拦截与请求认证,保障接口安全。
499 2
|
Java 数据库连接 微服务
若依微服务的Mybatis-plus集成过程:一份详细的入门教程。
以上就是Spring Boot项目中集成MyBatis Plus的详细步骤。集成成功后,你就可以使用Mybatis-plus提供的强大功能,让你的增删改查操作更为简单。以上步骤简单易懂,非常适合初学者使用。希望对您有所帮助。
1171 20
|
SQL Java 数据库连接
结合Spring和MyBatis实现DAO层操作综述
通过上述步骤,可以实现一个简洁、解耦和可维护性高的DAO层,利用Spring的功能强大之处,同时充分发挥MyBatis对SQL精细控制的优势。开发者可以实现快速开发,且能保持SQL语句的灵活性和清晰度。这种模式已经被证明是实践中非常高效和流行的企业级应用开发方式。
273 8
|
算法 Java 测试技术
mybatis-plus雪花算法生成Id使用详解
mybatis-plus雪花算法生成Id使用详解
6333 0
mybatis-plus雪花算法生成Id使用详解
dynamic-datasource动态添加移除数据源
dynamic-datasource动态添加移除数据源
1510 0