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 运行?

带有 Spring Security 的氛围

客服系统用户上线前压力测试结果:无卡顿无丢失漏消息现象客服回复消息无延迟

angularjs客户端和spring后端用户登录和会话管理