DelegatingFilterProxy过滤器和它代理的FilterChainProxy过滤器

本文围绕DelegatingFilterProxy过滤器和它代理的FilterChainProxy过滤器展开。介绍了SpringSecurity需导入的依赖,分析web.xml配置,解答为何配置DelegatingFilterProxy而非FilterChainProxy的疑惑,还对DelegatingFilterProxy进行源码分析,阐述其属性作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DelegatingFilterProxy过滤器和它代理的FilterChainProxy过滤器

SpringSecurity需要导入的依赖

在这里插入图片描述

理解几个单词的意思:

​ delegate:代表,委托

​ DelegatingFilterProxy:委托过滤器代理

​ FilterChainProxy:过滤器链代理

​ security:安全

web.xml配置

先要在web.xml文件中配置DelegatingFilterProxy过滤器的信息:

<filter>
		<filter-name>filter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>filter</filter-name>
		<url-pattern>/admin/*</url-pattern>
	</filter-mapping>

疑惑

用过Spring Security的人都会熟悉以上代码,一般教程上都会说明,使用Spring Security就需要在web.xml中指定以上代码。从这个配置中,可能会给我们造成一个错觉,以为DelegatingFilterProxy类就是springSecurity的入口,但其实这个类位于spring-web这个jar下面,说明这个类本身是和springSecurity无关,那么问题来了,既然这个过滤器类本身和SpringSecurity无关,那么为什么还需要在web.xml中配置这个过滤器类的相关信息呢,为什么不直接配置FilterChainProxy的配置信息呢?

DelegatingFilterProxy类的位置如下图:

在这里插入图片描述

与SpringSecurity框架关系最密切的是FilterChainProxy这个过滤器,它的位置是在org.springframework.security.web中,如下图

在这里插入图片描述

解决疑惑

主要是因为DelegatingFilterProxy可以代理FilterChainProxy。

因为SpringSecurity的核心过滤器链主要是在SpringApplication容器里面,过滤器链的名字是FilterChainProxy,过滤器链也可以看成一个大的过滤器,然后IOC容器中的这个bean会交给DelegatingFilterProxy代理,相当于在DelegatingFilterProxy中实现了FilterChainProxy这个类,于是只需要在web.xml文件中配置DelegatingFilterProxy的相关信息就可以通过此过滤器来代理SpringSecurity中最重要的过滤器FilterChainProxy。

DelegatingFilterProxy相当于一个代理类,它会通过web.xml配置中的DelegatingFilterProxy对应的filter-name去spring的IOC容器中寻找id是filter-name的过滤器,也即是FilterChainProxy,找到之后执行DelegatingFilterProxy中对应的过滤逻辑。

那么上面的使用web.xml中配置的DelegatingFilterProxy去代理spring的IOC容器中的FilterChainProxy在源码中是怎样实现的呢?下面来分析源码:

分析源码

DelegatingFilterProxy类继承于抽象类GenericFilterBean,间接地implement 了javax.servlet.Filter接口,Servlet容器在启动时,首先会调用Filter的init方法,GenericFilterBean的作用主要是可以把Filter的初始化参数自动地set到继承于GenericFilterBean类的Filter中去。在其init方法的如下代码就是做了这个事:

首先来看一下DelegatingFilterProxy这个类的继承:

在这里插入图片描述

在这里插入图片描述

可以看出DelegatingFilterProxy继承了GenericFilterBean抽象类,而GenericFilterBean抽象类实现了javax.servlet.Filter接口,因此相当于DelegatingFilterProxy间接实现了javax.servlet.Filter接口,因此DelegatingFilterProxy也是一个过滤器。

其次就是在Sevlet容器启动的时候,也就是web.xml文件开始加载的时候会自动找到里面的DelegatingFilterProxy配置,然后调用此过滤器的init方法,但是此过滤器是没有init方法的,因此会调用父类GenericFilterBean的抽象方法给DelegatingFilterProxy初始化赋值,父类GenericFilterBean中的init方法中有一个initFilterBean方法,此方法其实是去调用DelegatingFilterProxy中的initFilterBean方法。

在这里插入图片描述

接下来就是回到DelegatingFilterProxy类中查看initFilterBean的源码,如下图

在这里插入图片描述

通过上图中的源码可以的出DelegatingFilterProxy类中的属性delegate代表的就是spring的IOC容器中的FilterChainProxy对象。

接下来查看DelegatingFilterProxy类中的initDelegate方法的源码,如下图:

在这里插入图片描述

然后会执行DelegatingFilterProxy的doFilter方法,doFilter方法的源码如下图:

在这里插入图片描述

最后是invokeDelegate的源码:

在这里插入图片描述

DelegatingFilterProxy过滤器的属性

在这里插入图片描述

在web.xml配置中

<filter>
		<filter-name>filter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<param-name>targetFilterLifecycle</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>filter</filter-name>
		<url-pattern>/admin/*</url-pattern>
	</filter-mapping>

有一个初始化参数是targetFilterLifecycle并且值设置成了true,targetFilterLifecycle也是DelegatingFilterProxy中的属性,有什么作用呢?targetFilterLifecycle可以让DelegatingFilterProxy代理的filter bean里init和destroy方法生效。

在这里插入图片描述

在这里插入图片描述

上面的两张图片是让DelegatingFilterProxy代理的filter也即是FilterChainProxy的init方法生效。

在这里插入图片描述

在这里插入图片描述

上面的两张图片是让DelegatingFilterProxy代理的filter也即是FilterChainProxy的destroy方法生效。

FilterChainProxy过滤器

在这里插入图片描述

在这里插入图片描述

<think>好的,用户想了解Spring Security中过滤器链的工作原理。首先,我需要回顾一下Spring Security的基本架构,特别是过滤器链的部分。根据之前的引用资料,Spring Security的安全机制主要依赖于一系列过滤器,这些过滤器按照特定的顺序执行,处理不同的安全任务,比如认证、授权、异常处理等。 首先,用户的问题是关于工作原理机制的,所以需要从整体流程入手。根据引用[1][2],Spring Security的过滤器链是通过DelegatingFilterProxyFilterChainProxy来实现的。DelegatingFilterProxy是Servlet容器的一部分,它负责将请求委托给Spring管理的FilterChainProxyFilterChainProxy则包含多个SecurityFilterChain,每个SecurityFilterChain对应一组安全配置,根据请求的URL选择不同的链。 接下来需要详细说明每个组件的作用。比如,DelegatingFilterProxy作为桥梁,连接Servlet容器Spring的FilterChainProxy。然后,FilterChainProxy是核心,负责管理多个SecurityFilterChain。每个SecurityFilterChain包含具体的过滤器,比如UsernamePasswordAuthenticationFilter处理表单登录,ExceptionTranslationFilter处理异常等。 然后,要解释过滤器链的加载过程。根据引用[2],Spring Boot集成时会自动配置这些过滤器,通过自动装配机制加载默认的过滤器链。需要提到默认的过滤器有哪些,以及它们的执行顺序,比如SecurityContextPersistenceFilter最先执行,用于恢复SecurityContext,接着是认证相关的过滤器,然后是授权相关的FilterSecurityInterceptor。 另外,需要说明过滤器链的工作机制,当请求到达时,DelegatingFilterProxy将请求转发给FilterChainProxy,然后根据请求的URL匹配对应的SecurityFilterChain,按顺序执行其中的过滤器。每个过滤器处理特定的任务,比如认证、授权,直到请求被处理或出现异常。 还要提到异常处理,比如ExceptionTranslationFilter如何处理AuthenticationExceptionAccessDeniedException,将它们转化为相应的HTTP响应,比如重定向到登录页面或返回403错误。 最后,可能需要举一个具体的例子,比如用户登录时的流程,涉及的过滤器如UsernamePasswordAuthenticationFilter,以及后续的授权过程如何通过FilterSecurityInterceptor进行权限检查。 同时,用户可能需要了解如何自定义过滤器链,比如添加或移除某些过滤器,调整顺序,或者创建多个SecurityFilterChain来处理不同的URL模式。这部分可以引用资料中的内容,比如引用[3]提到的过滤器职责顺序的重要性。 总结起来,回答需要覆盖DelegatingFilterProxyFilterChainProxy、SecurityFilterChain的关系,过滤器链的加载执行流程,关键过滤器的作用,以及异常处理机制。同时,结合引用资料中的信息,确保回答准确并引用相关引用标记。</think>Spring Security过滤器链的工作原理可分为三个核心层次,通过DelegatingFilterProxyFilterChainProxySecurityFilterChain的协同实现安全控制流程[^1][^2][^3]。 ### 一、核心机制分层解析 1. **DelegatingFilterProxy(Servlet容器层)** - 作为Servlet Filter注册到Web容器,名称固定为`springSecurityFilterChain` - 作用:将请求代理给Spring管理的FilterChainProxy对象 - 示例代码配置: ```xml <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> ``` 2. **FilterChainProxy(Spring控制层)** - 包含多个SecurityFilterChain对象,结构为: $$ \text{FilterChainProxy} = \{\text{SecurityFilterChain}_1, \text{SecurityFilterChain}_2, ...\} $$ - 根据请求URL匹配对应链,执行顺序遵循最长路径匹配原则 3. **SecurityFilterChain(业务规则层)** - 包含具体过滤器序列,默认链包含15个核心过滤器[^4] - 典型过滤器执行顺序: ```text SecurityContextPersistenceFilter → LogoutFilter → UsernamePasswordAuthenticationFilter → ... → FilterSecurityInterceptor ``` ### 二、关键过滤器功能解析 | 过滤器名称 | 作用描述 | |---------------------------------|--------------------------------------------------------------------------| | SecurityContextPersistenceFilter | 通过SecurityContextRepository在请求间持久化安全上下文 | | UsernamePasswordAuthenticationFilter | 处理表单登录请求,生成UsernamePasswordAuthenticationToken | | AnonymousAuthenticationFilter | 为未认证请求附加匿名身份令牌 | | ExceptionTranslationFilter | 转换安全异常为HTTP响应(如401/403),触发认证入口点 | | FilterSecurityInterceptor | 访问控制的最后屏障,执行权限校验(调用AccessDecisionManager) | ### 三、工作流程示例 当请求`/api/private`时: 1. DelegatingFilterProxy将请求路由到FilterChainProxy 2. 匹配包含该URL模式的SecurityFilterChain 3. 执行链中过滤器: - `SecurityContextPersistenceFilter` 恢复会话中的SecurityContext - `FilterSecurityInterceptor` 校验权限时抛出AccessDeniedException - `ExceptionTranslationFilter` 捕获异常,触发AccessDeniedHandler返回403响应 ### 四、配置扩展机制 1. **自定义过滤器链** ```java @Configuration public class SecurityConfig { @Bean public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception { http.securityMatcher("/api/**") .addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class) .authorizeRequests().anyRequest().hasRole("API_USER"); return http.build(); } } ``` 2. **禁用默认过滤器** ```java http.removeFilter(LogoutFilter.class) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr-X~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值