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); } });