当前位置: 首页 > news >正文

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

一、过滤器

Spring SecurityServlet 支持基于 Servlet 过滤器,因此首先了解过滤器的作用会很有帮助。

下图为单个 HTTP 请求的处理程序的典型分层。

在这里插入图片描述
客户端向应用程序发送一个请求,运行容器创建一个FilterChain(过滤链),其中包括所有的Filter实例和Servlet。过滤器根据URI路径处理请求响应

在一个SpringMvcSpring Boot)应用程序中,一般只有一个Servlet实例,也就是 DispatcherServlet,他们按照指定的顺序(每个Filter实例实例的顺序非常重要),共同协作。

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

// 使用@ServletComponentScan添加在启动类上扫描该自定义过滤器@WebFilter(filterName = "simpleFilter", urlPatterns = {"/*"})
@Slf4j
public class SimpleFilter3 implements Filter {public void init(FilterConfig filterConfig) throws ServletException {log.info("初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("业务处理开始");filterChain.doFilter(servletRequest, servletResponse);log.info("业务处理结束");}public void destroy() {log.info("销毁");}
}

二、DelegatingFilterProxy

Spring提供了一个名为DelegatingFilterProxy的实现,它允许Servlet容器和Spring IoC容器的生命周期之间进行桥接。

Servlet容器使用自己的标准注册Filter实例,但它不知道Spring IoC容器中定义的过滤器Bean。在有了DelegatingFilterProxy后就可以很方便的在Servlet中使用Spring IoC容器来管理过滤器Bean

请求响应过程中,DelegatingFilterProxySpring IoC容器中查询注册的过滤器Bean对象,然后调用Bean的过滤方法。

下图为DelegatingFilterProxy是如何让使用Filter实例和FilterChain的。

在这里插入图片描述
DelegatingFilterProxy源码中可以看到该类包含了Spring IoC容器和被代理的过滤器:

在这里插入图片描述

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

// Spring定义的Bean Filter
@Component("simpleFilter")
@Slf4j
public class SimpleFilter2 implements Filter {public void init(FilterConfig filterConfig) throws ServletException {log.info("初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("业务处理开始");filterChain.doFilter(servletRequest, servletResponse);log.info("业务处理结束");}public void destroy() {log.info("销毁");}
}@Configuration
public class SimpleConfig {@Beanpublic DelegatingFilterProxyRegistrationBean delegatingFilterProxyRegistrationBean() {DelegatingFilterProxyRegistrationBean delegatingFilterProxy = new DelegatingFilterProxyRegistrationBean("simpleFilter");delegatingFilterProxy.addUrlPatterns("/*");delegatingFilterProxy.setOrder(-5);Map<String, String> initParameters = new HashMap<>();initParameters.put("targetFilterLifecycle", "true");delegatingFilterProxy.setInitParameters(initParameters);return delegatingFilterProxy;}
}

三、FilterChainProxy

Spring Security提供FilterChainProxy代理类,是Spring Security使用的核心,用于代理Spring Security中所有的SecurityFilterChain,而在SecurityFilterChain 中又包含多个Spring Security声明的Filter

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

在这里插入图片描述

FilterChainProxy源码中可以看到该类代理了Spring Security中所有的SecurityFilterChain
在这里插入图片描述

FilterChainProxy本质上是一个特殊的过滤器,通过DelegatingFilterProxy进行代理,所有其也是一个Bean对象。

SecurityFilterChain过滤链中通常都是Bean对象,通过FilterChainProxy进行注册与直接通过Servlet容器或通过DelegatingFilterProxy进行注册相比,FilterChainProxy注册有很多优势:

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

相关文章:

  • 免费(daoban)gpt,同时去除广告
  • SSH 端口转发:动态转发、本地转发、远程转发
  • git log 用法
  • Python数据分析实战-筛选出DataFrame中指定列都不包含缺失值的记录(附源码和实现效果)
  • 【Spring】SpringWebMVC入门
  • 自定义QChartView实现鼠标放在图表时,显示鼠标位置坐标值(x,y)
  • 能卷死同行的收银系统源码--服装店收银系统+进销存、PHP+mysql
  • 大文件分片上传并发
  • Linux———— 运算命令
  • PyTorch入门学习(十):神经网络-非线性激活
  • QT之多个界面相互切换 (stackedWidget控件)
  • 基于 golang 从零到一实现时间轮算法 (一)
  • uniapp书写顶部选项卡代码详细例子
  • 在Spring中,教你一招优雅的获取国际化语言配置的方法
  • 接口测试 —— Jmeter读取数据库数据作测试参数
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 07.Android之多媒体问题
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • js数组之filter
  • nodejs:开发并发布一个nodejs包
  • Python 反序列化安全问题(二)
  • Vultr 教程目录
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 对超线程几个不同角度的解释
  • 前端学习笔记之观察者模式
  • 前言-如何学习区块链
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 《天龙八部3D》Unity技术方案揭秘
  • 仓管云——企业云erp功能有哪些?
  • ​iOS实时查看App运行日志
  • ​批处理文件中的errorlevel用法
  • #if和#ifdef区别
  • $.ajax,axios,fetch三种ajax请求的区别
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)c52学习之旅-流水LED灯
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)http-server应用
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)甲方乙方——赵民谈找工作
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Remoting学习笔记(三)信道
  • .NET Standard 的管理策略
  • .net的socket示例
  • .net与java建立WebService再互相调用
  • .net中生成excel后调整宽度
  • /dev/sda2 is mounted; will not make a filesystem here!
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • []指针
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)