springboot2.1.8/springsecurity借助redis完成session集群管理

文章目录

  • 1 spring-session+redis配置
  • 2 ImageCode`序列化`报错问题
  • 3 session集群简单测试
  • 4 一个小故事

项目源码地址 https://github.com/nieandsun/security

1 spring-session+redis配置

session集群管理,或者说session共享我想大家都懂,这里我就不过多叙述了。
注意:我项目里现在用的springboot版本为2.1.8.RELEASE,早一点的版本如1.5.6RELEASE可能不适用。

  • 首先需要在pom.xml里再引入如下两个依赖
  <dependency>
      <groupId>org.springframework.sessiongroupId>
      <artifactId>spring-session-data-redisartifactId>
  dependency>

  <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-data-redisartifactId>
  dependency>
  • 其次需要在yml或properties文件里指定存储session信息的为redis、并配置redis的数据库信息
spring:
  ### 指定用什么存储session信息---可选项可参看源码StoreType枚举类
  session:
    store-type: redis
  ###本地环境下不配置也可以
#  redis:
#    host: 127.0.0.1
#    port: 6379
#    password: 123
#    database: 0

其实完成了以上配置,我们的项目就已经完成了借助redis进行session集群管理的开发。
但是这里必须要指出的一点是存放到redis里的对象,必须是要序列化的,即必须实现 Serializable 接口。

再强调一次:存到redis里的对象必须是序列化的即实现了Serializable 接口 — 其属性如果是一个对象的话,也必须实现了Serializable 接口。


2 ImageCode序列化报错问题

启动我们的项目,访问登陆页发现图形验证码显示不出来,后端报如下错误:
验证码显示不出的效果
springboot2.1.8/springsecurity借助redis完成session集群管理_第1张图片
后端报错信息
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.nrsc.security.core.validate.code.image.ImageCode]

原因(非常重要)
由于我们项目里ImageCode对象没有实现Serializable 接口,且该类里有一个属性 — BufferedImage对象,该对象也没有实现Serializable 接口,因此才会报出序列化错误。

再次强调:存到redis里的对象必须是序列化的即实现了Serializable 接口 — 其属性如果是一个对象的话,也必须实现了Serializable 接口。

具体解决方式这里就不再贴了,可以查看github上的commit记录。
项目源码地址为https://github.com/nieandsun/security


3 session集群简单测试

(1)首先以8080端口和8060端口分别启动我们的项目
(2)在访问8080并进行登陆
springboot2.1.8/springsecurity借助redis完成session集群管理_第2张图片
(3)在不登陆的情况下直接访问8060服务器的接口 — 无需登陆可直接获得到数据,证明我们借助redis搭建的session集群管理已经生效
springboot2.1.8/springsecurity借助redis完成session集群管理_第3张图片
再看一下存到redis里的数据内容:
在这里插入图片描述
(4)同时上两篇文章里session超时时间设置和并发控制功能都仍然有效。

4 一个小故事

差不多一年之前,来到了现在的公司,而我所在的小组正好负责我们整个部门的权限这一块,公司里就用到了spring-session。说实话,在这之前我是没接触过spring-session的,并且还就真手写过利用jedis操作redis来实现session共享的代码,所以当时为了搞清这块业务,就想当然的一个劲地找jedis操作redis的相关逻辑,最后实在找不到还很疑惑的问一个同事:“这咋回事啊?”后来同事就给我普及了一下spring-session的相关知识,当时就一个感觉spring真牛逼!!!

你可能感兴趣的:(spring-security,session集群管理)