我在异步模式下使用带有 Spring MVC 和 Spring 安全性的 Tomcat 7。
然后我使用 DeferredResult 发出异步请求。该机制工作正常,但问题是当 deferredResult 执行 setResult() 并返回 promise 时,我丢失了所有 session ,并且我的下一个请求给我一个 403 禁止,因为我没有在我的 SecurityContextHolder 上进行身份验证。
我猜是因为 promise 的返回是在另一个没有 session 的线程中完成的。
有人可以在这里把我引向正确的方向。
解决方案:onCompletion 回调方法我传递我在 map 中创建 deferredResult 时放置的 session 。
deferredResult.onCompletion(new Runnable() {
@Override
public void run() {
request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult));
securityContextContainer.remove(deferredResult);
}
});
最佳答案
解决方案:onCompletion 回调方法我传递我在 map 中创建 deferredResult 时放置的 session 。
deferredResult.onCompletion(new Runnable() {
@Override
public void run() {
request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult));
securityContextContainer.remove(deferredResult);
}
});
关于java - Spring 延迟结果丢失了 http session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29716119/