0


Spring Security 6.1.x 系列(2)—— 基于过滤器的基础原理(一)

一、过滤器

  1. Spring Security

  1. Servlet

支持基于

  1. Servlet

过滤器,因此首先了解过滤器的作用会很有帮助。

下图为单个

  1. HTTP

请求的处理程序的典型分层。

在这里插入图片描述
客户端向应用程序发送一个请求,运行容器创建一个

  1. FilterChain

(过滤链),其中包括所有的

  1. Filter

实例和

  1. Servlet

。过滤器根据

  1. URI

路径处理请求响应

在一个

  1. SpringMvc

  1. Spring Boot

)应用程序中,一般只有一个

  1. Servlet

实例,也就是

  1. DispatcherServlet

,他们按照指定的顺序(每个

  1. Filter

实例实例的顺序非常重要),共同协作。

一个简单的自定义过滤器代码示例:

  1. // 使用@ServletComponentScan添加在启动类上扫描该自定义过滤器@WebFilter(filterName ="simpleFilter", urlPatterns ={"/*"})@Slf4jpublicclassSimpleFilter3implementsFilter{publicvoidinit(FilterConfig filterConfig)throwsServletException{
  2. log.info("初始化");}@OverridepublicvoiddoFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throwsIOException,ServletException{
  3. log.info("业务处理开始");
  4. filterChain.doFilter(servletRequest, servletResponse);
  5. log.info("业务处理结束");}publicvoiddestroy(){
  6. log.info("销毁");}}

二、DelegatingFilterProxy

  1. Spring

提供了一个名为

  1. DelegatingFilterProxy

的实现,它允许

  1. Servlet

容器和

  1. Spring IoC

容器的生命周期之间进行桥接。

  1. Servlet

容器使用自己的标准注册

  1. Filter

实例,但它不知道

  1. Spring IoC

容器中定义的过滤器

  1. Bean

。在有了

  1. DelegatingFilterProxy

后就可以很方便的在

  1. Servlet

中使用

  1. Spring IoC

容器来管理过滤器

  1. Bean

请求响应过程中,

  1. DelegatingFilterProxy

  1. Spring IoC

容器中查询注册的过滤器

  1. Bean

对象,然后调用

  1. Bean

的过滤方法。

下图为

  1. DelegatingFilterProxy

是如何让使用

  1. Filter

实例和

  1. FilterChain

的。

在这里插入图片描述

  1. DelegatingFilterProxy

源码中可以看到该类包含了

  1. Spring IoC

容器和被代理的过滤器:

在这里插入图片描述

一个简单的DelegatingFilterProxy使用代码示例:

  1. // Spring定义的Bean Filter@Component("simpleFilter")@Slf4jpublicclassSimpleFilter2implementsFilter{publicvoidinit(FilterConfig filterConfig)throwsServletException{
  2. log.info("初始化");}@OverridepublicvoiddoFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throwsIOException,ServletException{
  3. log.info("业务处理开始");
  4. filterChain.doFilter(servletRequest, servletResponse);
  5. log.info("业务处理结束");}publicvoiddestroy(){
  6. log.info("销毁");}}@ConfigurationpublicclassSimpleConfig{@BeanpublicDelegatingFilterProxyRegistrationBeandelegatingFilterProxyRegistrationBean(){DelegatingFilterProxyRegistrationBean delegatingFilterProxy =newDelegatingFilterProxyRegistrationBean("simpleFilter");
  7. delegatingFilterProxy.addUrlPatterns("/*");
  8. delegatingFilterProxy.setOrder(-5);Map<String,String> initParameters =newHashMap<>();
  9. initParameters.put("targetFilterLifecycle","true");
  10. delegatingFilterProxy.setInitParameters(initParameters);return delegatingFilterProxy;}}

三、FilterChainProxy

  1. Spring Security

提供

  1. FilterChainProxy

代理类,是

  1. Spring Security

使用的核心,用于代理

  1. Spring Security

中所有的

  1. SecurityFilterChain

,而在

  1. SecurityFilterChain

中又包含多个

  1. Spring Security

声明的

  1. Filter

下图

  1. FilterChainProxy

在整个请求响应过程中的作用。

在这里插入图片描述

  1. FilterChainProxy

源码中可以看到该类代理了

  1. Spring Security

中所有的

  1. SecurityFilterChain


在这里插入图片描述

  1. FilterChainProxy

本质上是一个特殊的过滤器,通过

  1. DelegatingFilterProxy

进行代理,所有其也是一个

  1. Bean

对象。

  1. SecurityFilterChain

过滤链中通常都是

  1. Bean

对象,通过

  1. FilterChainProxy

进行注册与直接通过

  1. Servlet

容器或通过

  1. DelegatingFilterProxy

进行注册相比,

  1. FilterChainProxy

注册有很多优势:

  • 它为 Spring Security 的所有 Servlet 支持提供了一个起点,如果需要对 Spring SecurityServlet 支持进行故障诊断可以在在 FilterchainProxy 中添加一个调试点。
  • 可以执行一些不被视为可有可无的任务,例如,清除了 SecurityContext 以避免内存泄漏、应用 Spring SecurityHttpFirewall 来保护应用程序免受某些类型的攻击
  • 在确定何时应该调用 SecurityFilterChain 方面提供了更大的灵活性,在 Servlet 容器中,Filter 实例仅基于URL 被调用。FilterChainProxy 可以通过使用 RequestMatcher 接口根据 HttpServletRequest 中的任何内容确定调用
标签: Spring Security

本文转载自: https://blog.csdn.net/ctwy291314/article/details/134134122
版权归原作者 gmHappy 所有, 如有侵权,请联系我们删除。

“Spring Security 6.1.x 系列(2)—— 基于过滤器的基础原理(一)”的评论:

还没有评论