如何阻止匿名用户会话向Redis写入数据
阻止Spring Session Redis为匿名用户创建会话条目
我完全理解你的困扰——每次有匿名用户(比如爬虫)访问受保护的/secured端点时,哪怕被正确重定向到登录页,Redis里还是会生成一堆不必要的会话条目,长期下来肯定会浪费资源。咱们来解决这个问题。
问题根源
默认情况下,Spring Security在处理未认证请求时,会先创建一个匿名会话,再执行重定向逻辑。而Spring Session会把这个匿名会话同步到Redis里,这就是那些冗余条目的来源。
解决方案
只需要在你的Spring Security配置中添加一行代码,阻止Spring Security为匿名用户创建会话:
修改AppConfiguration类中的configure(HttpSecurity http)方法,加入.anonymous().createSession(false)配置:
@Configuration @EnableWebSecurity @EnableRedisHttpSession(redisNamespace = "demo-redis-data-session") public static class AppConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user").password("0000").roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin().and() .authorizeRequests().antMatchers("/ping").permitAll() .anyRequest().fullyAuthenticated() .and() // 关键配置:禁止为匿名用户创建会话 .anonymous().createSession(false); } }
原理说明
anonymous().createSession(false)告诉Spring Security:不要为匿名用户创建任何会话。这样当匿名用户访问受保护资源时,系统会直接触发重定向到登录页的逻辑,不会生成任何会话对象,自然Spring Session也就不会往Redis里写入那些冗余条目了。
验证效果
- 匿名访问
/secured:会被302重定向到登录页,此时查看Redis的keys *,不会新增任何会话相关条目。 - 登录后访问
/secured:系统会正常创建会话并同步到Redis,完全不影响已登录用户的会话管理。 - 退出登录:会话会被正确销毁,Redis里的对应条目也会被清理。
这个配置完全适配你使用的Spring Boot 1.5.9.RELEASE版本,不需要额外引入依赖,直接修改现有代码即可生效。
内容的提问来源于stack exchange,提问作者Fabio Maffioletti
相关产品推荐
相关产品推荐

