2015-04-18 3 views
0

Я использую Tomcat 7 с функцией Spring MVC и Spring в асинхронном режиме.Весна Отсроченный результат потерял http-сеанс

Затем я использую DeferredResult для запроса async. Механизм работает отлично, но проблема заключается в том, что когда deferredResult делает setResult() и возвращает обещание, я потерял всю свою сессию, и мой следующий запрос дал мне запрет на 403, поскольку у меня нет моей аутентификации на моем SecurityContextHolder.

Я думаю, это потому, что возвращение обещания выполняется в другом потоке, который не имеет сеанса.

Кто-нибудь может поставить меня в правильном направлении здесь, пожалуйста.

Метод обратного вызова onCompletion Я передаю сеанс, который я помещаю, когда создаю отложенный запрос на карте.

 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); 
    } 
}); 
Смежные вопросы