Java中由于Shiro/SpringSecurity框架对匿名用户请求缓存过多引起的内存泄漏

老枫姑娘_5845

老枫姑娘_5845

2026-06-19

772人浏览

原创

shiro或spring security对匿名用户请求缓存本身无害,问题在于缓存策略失控:未设过期时间、无容量上限、key设计不合理,导致对象长期驻留堆内存,引发oom。

java中由于shiro/springsecurity框架对匿名用户请求缓存过多引起的内存泄漏

Shiro 或 Spring Security 对匿名用户请求做缓存,本身不是问题;问题出在缓存策略失控——对象长期驻留、未设上限、未及时淘汰,最终拖垮堆内存。

缓存对象没设过期或容量限制

框架默认可能启用缓存(如 Shiro 的 AuthorizationInfo 缓存、Spring Security 的 DefaultCacheBasedRequestMatcher),但若未配置 TTL 或最大条目数,每次匿名请求都会生成新缓存项并永久保留。

  • 例如:匿名访问 `/public/**` 路径时,Security 框架仍会构造并缓存 `Authentication` 或 `FilterInvocation` 对象
  • 这些对象常持有 `Principal`、`GrantedAuthority`、甚至 `HttpServletRequest` 引用,间接拉入大量临时数据
  • 静态 Map 或未配置回收策略的 Guava/Caffeine 缓存,会持续增长,GC 无法清理

RememberMe 或 Session 相关缓存滥用

Shiro 的 `CookieRememberMeManager` 或 Spring Session + Redis 组合,在处理未登录用户时,也可能误发或冗余创建 session/remember-me 上下文。

Java Maven Secondary Analysis
Java Maven Secondary Analysis

分析ZIP压缩包或GitLab仓库中的Java Maven项目,确定二次开发范围、类数量、模块分布及生产相关指标。

下载
  • 比如每次匿名请求都触发 `createSession()`,即使只存空 session ID,Redis 中也会堆积大量过期键(spring:session:sessions:expires:{id})
  • Shiro 默认使用 `MemorySessionDAO` 时,session 实例直接留在堆中,无自动清理机制
  • 结合 `ThreadLocal` 存储上下文(如 `SecurityUtils.getSubject()` 返回的 Subject),线程复用场景下易引发隐式内存滞留

缓存 Key 设计不合理,导致缓存爆炸

若缓存 Key 包含动态参数(如时间戳、随机 UUID、完整 request URI),则几乎每个请求都命中新 Key,缓存彻底失效且持续膨胀。

  • 典型反例:cache.put(request.getRequestURL() + "?" + request.getQueryString(), authResult)
  • URI 中含分页参数、traceId、时间戳等,导致缓存项不可复用,数量随 QPS 线性增长
  • Key 未标准化(大小写、编码、顺序差异),进一步加剧重复缓存

解决方案:轻量、可控、可监控

不靠禁用安全功能,而靠精准控制缓存生命周期:

  • 显式关闭非必要缓存:Shiro 中设 securityManager.cacheManager = null;Spring Security 中禁用 requestCache 或使用空实现
  • 对必须缓存的授权结果,统一用 Caffeine 并强制配置:maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES)
  • 匿名路径走白名单直通,绕过所有认证/授权缓存逻辑(如 Spring Security 的 permitAll() 配置需前置且明确)
  • 开启 Actuator 的 /actuator/metrics/cache.* 端点,监控 hit/miss ratio 和 size,异常增长即告警

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10017

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7162

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6312

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1084

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1316

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2629

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19971

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习