项目源码地址 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.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</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序列化
报错问题
启动我们的项目,访问登陆页发现图形验证码显示不出来,后端报如下错误:
验证码显示不出的效果
后端报错信息
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并进行登陆
(3)在不登陆的情况下直接访问8060服务器的接口 — 无需登陆可直接获得到数据,证明我们借助redis搭建的session集群管理已经生效
再看一下存到redis里的数据内容:
(4)同时上两篇文章里session超时时间设置和并发控制功能都仍然有效。
4 一个小故事
差不多一年之前,来到了现在的公司,而我所在的小组正好负责我们整个部门的权限这一块,公司里就用到了spring-session。说实话,在这之前我是没接触过spring-session的,并且还就真手写过利用jedis操作redis来实现session共享的代码,所以当时为了搞清这块业务,就想当然的一个劲地找jedis操作redis的相关逻辑,最后实在找不到还很疑惑的问一个同事:“这咋回事啊?”后来同事就给我普及了一下spring-session的相关知识,当时就一个感觉spring真牛逼!!!