常用过滤器介绍

简介: 本文介绍了Spring Security中的核心过滤器链,涵盖SecurityContextPersistenceFilter、CsrfFilter、LogoutFilter等15个关键过滤器的作用与执行顺序。每个过滤器各司其职,如维护安全上下文、处理认证、防止CSRF攻击、管理会话等,共同构建起完整的安全控制流程。实际加载的过滤器会根据配置动态调整,并非一成不变。

过滤器是一种典型的AOP思想,关于什么是过滤器就不赘述了,读者们应该也都知道凡是web工程都能用过滤器。 接下来咱们就一起看看Spring Security中这些过滤器都是干啥用的,源码我就不贴出来了,有名字,大家可以自己在idea中Double Shift去。我也会在后续的学习过程中穿插详细解释。

1. org.springframework.security.web.context.SecurityContextPersistenceFilter

首当其冲的一个过滤器,作用之重要自不必多言。 SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存或更新一个SecurityContext,并将SecurityContext给以后的过滤器使用,来为后续filter建立所需的上下文。
SecurityContext中存储了当前用户的认证以及权限信息。

2. org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter

此过滤器用于集成SecurityContext到Spring异步执行机制中的WebAsyncManager

3. org.springframework.security.web.header.HeaderWriterFilter

向请求的Header中添加相应的信息,可在http标签内部使用security:headers来控制

4. org.springframework.security.web.csrf.CsrfFilter

csrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的token信息, 如果不包含,则报错。起到防止csrf攻击的效果。

5. org.springframework.security.web.authentication.logout.LogoutFilter

匹配URL为/logout的请求,实现用户退出,清除认证信息。

6. org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter

认证操作全靠这个过滤器,默认匹配URL为/login且必须为POST请求。

7. org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter

如果没有在配置文件中指定认证页面,则由该过滤器生成一个默认认证页面。

8. org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter

由此过滤器可以生产一个默认的退出登录页面

9. org.springframework.security.web.authentication.www.BasicAuthenticationFilter

此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头信息。

10. org.springframework.security.web.savedrequest.RequestCacheAwareFilter

通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存HttpServletRequest

11. org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter

针对ServletRequest进行了一次包装,使得request具有更加丰富的API

12. org.springframework.security.web.authentication.AnonymousAuthenticationFilter

当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到SecurityContextHolder中。 spring security为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。

13. org.springframework.security.web.session.SessionManagementFilter

SecurityContextRepository限制同一用户开启多个会话的数量

14. org.springframework.security.web.access.ExceptionTranslationFilter

异常转换过滤器位于整个springSecurityFilterChain的后方,用来转换整个链路中出现的异常

15. org.springframework.security.web.access.intercept.FilterSecurityInterceptor

获取所配置资源访问的授权信息,根据SecurityContextHolder中存储的用户信息来决定其是否有权
限。
好了!这一堆排山倒海的过滤器介绍完了。 那么,是不是spring security一共就这么多过滤器呢?答案是否定的!随着spring-security.xml配置的添加,还 出现新的过滤器。
那么,是不是spring security每次都会加载这些过滤器呢?答案也是否定的!随着spring-security.xml配置的修改,有些过滤器可能会被去掉。我们一步步往下走着看。

若有收获,就点个赞吧


相关文章
|
2月前
|
存储 安全 Java
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,替换为原始类型(如Object或限定类型)。这导致List<String>和List<Integer>在运行时等价于List,引发反射可插入不兼容类型等问题。同时,泛型不支持基本数据类型、静态上下文中使用受限,且instanceof无法用于泛型类型判断。编译器通过桥接方法等机制解决多态冲突,并在获取元素时自动插入类型转换,保证类型安全。
|
2月前
|
NoSQL Linux Shell
MongoDB单机部署
本文介绍MongoDB在Windows和Linux系统中的安装、配置与启动方法,包括下载地址、版本选择、解压安装、命令行及配置文件启动方式,并说明如何通过Mongo Shell和Compass图形化工具连接数据库,同时涵盖Linux环境下的服务部署、防火墙设置与安全关闭操作。
MongoDB单机部署
|
2月前
|
Java 调度
ScheduledThreadPoolExecutor解析
ScheduledThreadPoolExecutor适用于延时或周期性任务调度,继承自ThreadPoolExecutor但功能更强大。它通过ScheduledFutureTask实现任务的周期执行,并利用DelayedWorkQueue实现延迟控制,结合siftUp/siftDown维护任务顺序,通过take方法阻塞等待到期任务,从而实现精准的定时调度功能。
ScheduledThreadPoolExecutor解析
|
2月前
|
存储 缓存 安全
One Trick Per Day
本文详解Java开发中六大易被忽视的陷阱:Map初始化容量设置不当、线程池滥用导致OOM、Arrays.asList的不可变性、遍历Map性能优化、SimpleDateFormat线程安全问题及并发更新加锁策略。通过源码分析与实例演示,揭示问题根源并提供Guava等最佳实践方案,助力提升系统稳定性与性能。
|
2月前
|
缓存 Java 数据库连接
MyBatis 常见配置
本文介绍了MyBatis的核心配置机制,包括属性加载优先级(方法参数 > resource/url > properties元素)、常用配置项如缓存、延迟加载、执行器类型等,并详解了多环境配置方式及事务管理器(JDBC与MANAGED)的使用场景和配置方法。
|
2月前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引基于B树结构,可高效支持查询,避免全表扫描。支持单字段、复合、地理空间、文本及哈希索引,提升查询性能,适用于多样数据场景。
|
2月前
|
存储 NoSQL 关系型数据库
MongoDB相关概念
MongoDB是一款高性能、无模式的文档型NoSQL数据库,适用于高并发读写、海量数据存储及高可用扩展场景。广泛应用于社交、游戏、物流、物联网和视频直播等领域,支持灵活的数据模型、丰富的查询语言和水平扩展,尤其适合非事务性、大数据量、快速迭代的应用需求。
|
2月前
|
缓存 算法 搜索推荐
Executors工厂类详解
Java提供了多种线程池创建方法:`newFixedThreadPool` 创建固定数量线程,适用于并发稳定场景;`newCachedThreadPool` 可缓存线程,适合短时高并发任务;`newSingleThreadExecutor` 保证任务顺序执行;`newScheduledThreadPool` 支持定时与周期性任务。不同线程池适应不同业务需求,合理选择可提升系统性能与资源利用率。
|
2月前
|
Java 调度
线程池初探
线程池是一种管理多个线程的池化技术,避免频繁创建与销毁线程,提升性能。它统一调度线程执行任务,任务完成后线程不销毁,可复用。使用线程池能减少资源开销、控制并发数量、简化多线程编程。通过 `Executors` 可快速创建普通或调度型线程池,提交任务并管理生命周期,最后需调用 shutdown 关闭。
|
2月前
|
Java
类加载的常见加载顺序
本文通过Java代码示例,讲解静态代码块、局部代码块与构造器的执行顺序。静态代码块随类加载执行且仅一次,优先于主函数;局部代码块在每次创建对象时执行;构造器随后执行。总结:静态 > 局部 > 构造器。