2015-04-18 102 views
0

我在Spring MVC和Spring安全模式下使用Tomcat 7進行異步模式。Spring延遲結果丟失http會話

然後我使用DeferredResult進行異步請求。該機制工作正常,但問題是,比deferredResult使setResult()並返回承諾時,我失去了我所有的會議,並且我的下一個請求給我一個403禁止,因爲我沒有我的身份驗證我的SecurityContextHolder。

我想是因爲承諾的回報是在另一個沒有會話的線程中完成的。

有人可以讓我在這裏正確的方向請。

解決方案:onCompletion回調方法我通過在地圖中創建deferredResult時放置的會話。

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

如果您確實解決了您自己的問題並將其作爲回答並接受,請不要將其附加到問題中。 – kryger

回答

1

解決方案:onCompletion回調方法我通過在地圖中創建deferredResult時放入的會話。

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