【问题标题】:Spring Deferred result lost http sessionSpring延迟结果丢失http会话
【发布时间】: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


【解决方案1】:

解决方案:onCompletion 回调方法我传递了我在地图中创建 deferredResult 时放置的会话。

  deferredResult.onCompletion(new Runnable() {
    @Override
    public void run() {
        request.getSession().setAttribute(SPRING_SECURITY_CONTEXT, securityContextContainer.get(deferredResult));
        securityContextContainer.remove(deferredResult);
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多