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


项目源码地址 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真牛逼!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值