项目使用redis存储session后,在controller拦截器执行方法后再次设置session无效

昨天分析了一晚上没找到原因,只好求助。

项目开发部署环境:

jfinal+tomcat+redis(session管理)

需求:

前端需要添加一个执行等待效里,我的实现思路是在拦截器里新开一个线程执行controller方法,方法的执行结果信息放在session里,前端不停的轮询方法是否执行完成。

问题描述:

之前session管理使用tomcat默认方式,现在改成了redis存储后该功能就出现问题了,未使用redis存储session之前是正常运行的。

我调试后发现,原因是在controllre拦截器调用invoke方法后再设置session值就无效了。

上传两张简化后的代码实现

图1:拦截器部份实现

image.png

图2:存放session的方法执行结果类

Image 02.png


评论区

JFinal

2018-09-07 11:45

不要在拦截器中新开线程执行 controller 方法, Controller 中有属性,其中的 request response 这类是会被 tomcat、jetty 随后接管的,开一个新线程,就有并发操作,数据立即混乱

JFinal

2018-09-07 11:48

new BackgroundProcess(...) 、bp.start() 这类在新建线程中是绝对不能传入 session、controller、request、response 这类参数的

解决办法是从 session、request、controller 拿到该拿的数据传到 BackgroundProcess 之中去

热门反馈

扫码入社