关于SessionInViewInterceptor触发StoppedSessionException异常的问题

出于项目集群需要,使用Shiro管理WebSession,但是在用户登出功能使用session手动销毁后发现,SessionInViewInterceptor在获取Session的时候获取的是已经被Shrio停止的Session导致触发了Shiro的StoppedSessionException异常,最后导致项目直接到了500页面。对于这种问题目前有什么好的解决方法吗?

jfinal使用的版本是2.2。

评论区

JFinal

2019-01-30 17:19

将 SessionInViewInterceptor 源码拿到手,然后改进一下这个源码

大致的改进方法是,在 SessionInViewInterceptor 中获取 session 后对其进行一下判断,如果 session 已经不可用了,或者说是被 Shrio 停止过的,则不使用它即可

JFinal

2019-01-30 17:20

假定你改进后的拦截器名字叫: MySessionInView

配置的时候,用 me.add(new MySessionInView()), 代替 jfinal 原有的 SessionInViewInterceptor 即可

lyaoyaoo113

2019-01-31 11:06

@JFinal 嗯,想过通过判断Session是否可用的方式来避开异常出现。但是在测试过程中发现,获取到的Session对象是ShiroHttpSession,这个和HttpSession差不多,本身没有什么特别的属性可以用来判断,而且通过方法获取属性值也会直接抛出异常。目前采取的一个方法是在SessionInViewInterceptor的核心代码里会出现异常的代码段使用try_catch进行异常监听,如果是StoppedSessionException异常,就直接忽略,其他异常抛出,测试后发现业务可以正常进行。但是从个人感觉来看总觉得将异常忽略总会有什么隐患,但是又没有什么好的替代方案,目前只能这样凑合着用了。

JFinal

2019-01-31 14:07

@lyaoyaoo113 catch StoppedSessionException 这个异常用着还可以

当然最好还是要找到办法确认当前的 ShiroHttpSession 是否真的不可用。 建议看看 shiro 让 ShiroHttpSession 不可用的那段源码,应该会改变对象里面的某个状态,否则 shiro 自己都没法好好使用了

记得搞定后再回来分享一下,可能会有其他小伙伴碰到这个问题,需要你的分享

热门反馈

扫码入社