Spring Deferred结果丢失了http会话
我在异步模式下使用带有Spring MVC和Spring安全性的Tomcat 7。
然后我使用DeferredResult来发出异步请求。 该机制工作正常,但问题是当deferredResult使setResult()并返回promise时,我丢失了所有会话,并且我的下一个请求给了我403禁止,因为我没有在SecurityContextHolder上进行身份validation。
我想是因为promise的返回是在另一个没有会话的线程中完成的。
有人可以把我放在正确的方向。
解决方案:onCompletion回调方法我传递了在地图中创建deferredResult时放置的会话。
deferredResult.onCompletion(new Runnable() { @Override public void run() { request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult)); securityContextContainer.remove(deferredResult); } });
解决方案:onCompletion回调方法我传递了在地图中创建deferredResult时放置的会话。
deferredResult.onCompletion(new Runnable() { @Override public void run() { request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult)); securityContextContainer.remove(deferredResult); } });