Spring Deferred结果丢失了http会话

时间:2015-04-18 10:39:49

标签: java spring spring-mvc tomcat asynchronous

我在异步模式下使用带有Spring MVC和Spring安全性的Tomcat 7。

然后我使用DeferredResult来发出异步请求。该机制工作正常,但问题是当deferredResult生成setResult()并返回promise时,我丢失了所有会话,并且我的下一个请求给了我403禁止,因为我没有在SecurityContextHolder上进行身份验证。

我猜是因为承诺的返回是在另一个没有会话的线程中完成的。

有人可以把我放在正确的方向。

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

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

1 个答案:

答案 0 :(得分:1)

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

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