异步线程RequestContextHolder为空问题
问题
RequestContextHolder.getRequestAttributes();
值为空,也就是常说的session丢失
分析
由于session
是线程安全的,无法直接在各个线程中传递,所以在服务间异步线程调用时,就会导致session丢失的问题
首先,为什么要分析这个RequestContextHolder
?
我们一般获取request和response是在过滤器Filter
、拦截器,或者controller层获取
但如果想在service层获取request和response呢?
正常来说在service层是没有request的,当我们需要在service层获取request和response时,我们可以在RequestContextHolder
中获取。
解决方案
在异步线程调用之前设置session允许继承
//设置异步线程之间可以共享session数据
RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);