咨询 spring+shiro+redis 做 session 共享问题

2018-02-08 12:10:42 +08:00
 liuhuansir

最近搞这块儿的东西,整个流程倒是实现了,遇到一个问题,涉及到 shiro 的源码,具体问题是:shiro 的 Session 类通过序列化存储在 redis 的时候,Session 的某些字段丢失了,我看了它的实现类 SimpleSession,丢失的字段被 transient 修饰了,导致这些字段没被序列化,问题来了,login 之后,session 被保存了,其他接口请求的时候,shiro 会去 redis 里获取该用户的 session,然后 sessionId 丢失了,报了如下异常:java.lang.IllegalArgumentException: The org.apache.shiro.session.mgt.DelegatingSession implementation requires that the SessionKey argument returns a non-null sessionId to support the Session.getId() invocations.

8006 次点击
所在节点    Java
9 条回复
liuhuansir
2018-02-08 12:15:09 +08:00
可能说的不够清楚,求好心人解答,有疑问可以提出来
azhw
2018-02-08 12:43:26 +08:00
以前考虑过这种方案, 有点麻烦放弃了.

tomcat 好像有个 redis 插件的, 直接配置下 xml 就可以 session 保存到 redis 中共享.
缺点: tomcat 版本好像有限制.

或者直接用 nginx +插件 / haproxy 配置负载均衡, session 粘滞 就好了.
qinxi
2018-02-08 12:50:28 +08:00
grq100296
2018-02-08 14:05:47 +08:00
去掉 shiro 的 session 管理器即可
bobuick
2018-02-08 14:26:37 +08:00
proxy 接管 shiro 这块对 session 的管理
liuhuansir
2018-02-08 14:29:56 +08:00
@grq100296 额,你是说不用 DefaultWebSessionManager,这个?
grq100296
2018-02-08 15:01:24 +08:00
@liuhuansir 对,把这个去掉就行了,session 交给 redis
top1ms
2018-12-26 09:47:28 +08:00
我目前也在做这个 遇见了 session 放 redis 反序列化出错的问题 我的问题是 SimpleSeesion vaild 这个属性 造成的 看了一下其他的解决方式 添加类 替换管理类 都比较麻烦 我目前的思路是 用一个 map 代理 SimpleSesssion 的参数 自定义的 SessionDAO doReadSession()方法中 再根据 map 里的值转换为 SimpleSession 如果不对 大佬萌指正吼
mingzihentebie
2019-05-07 14:18:15 +08:00
请问作者解决 sessionid 丢失的问题了吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/429424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX