【发布时间】:2015-06-25 07:16:55
【问题描述】:
我在异步模式下使用带有 Spring MVC 和 Spring 安全性的 Tomcat 7。
然后我使用 DeferredResult 发出异步请求。该机制工作正常,但问题是当 deferredResult 进行 setResult() 并返回承诺时,我失去了所有会话,并且我的下一个请求给了我一个 403 禁止,因为我没有在我的 SecurityContextHolder 上进行身份验证。
我猜是因为 promise 的返回是在另一个没有会话的线程中完成的。
请有人帮我指明正确的方向。
解决方案:onCompletion 回调方法我传递了我在地图中创建 deferredResult 时放置的会话。
deferredResult.onCompletion(new Runnable() {
@Override
public void run() {
request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult));
securityContextContainer.remove(deferredResult);
}
});
【问题讨论】:
-
如果您确实解决了自己的问题,请将其发布为答案并接受,请勿将其附加到问题中。
标签: java spring spring-mvc tomcat asynchronous