Spring延迟结果丢失http会话
Posted
技术标签:
【中文标题】Spring延迟结果丢失http会话【英文标题】:Spring Deferred result lost http session 【发布时间】: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);
);
【问题讨论】:
如果您确实解决了自己的问题,请将其发布为答案并接受,请勿将其附加到问题中。 【参考方案1】:解决方案:onCompletion 回调方法我传递了我在地图中创建 deferredResult 时放置的会话。
deferredResult.onCompletion(new Runnable()
@Override
public void run()
request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult));
securityContextContainer.remove(deferredResult);
);
【讨论】:
以上是关于Spring延迟结果丢失http会话的主要内容,如果未能解决你的问题,请参考以下文章
休眠延迟加载不适用于 Spring Boot => 无法延迟初始化角色集合无法初始化代理 - 无会话
RabbitMQ:第二章:Spring整合RabbitMQ(简单模式,广播模式,路由模式,通配符模式,消息可靠性投递,防止消息丢失,TTL,死信队列,延迟队列,消息积压,消息幂等性)(代码
如何延迟 Spring JPA 自动配置直到 bean 运行?