2015-09-30 3 views
2

ли получить доступ к сессии в контроллерах Spring MVC просто с @Autowired как это:Доступ к HttpSession в ClientHttpRequestInterceptor в Spring MVC

@Autowired 
private HttpSession session; 

Проблема заключается в том, я теперь доступ к сеансу в ClientHttpRequestInterceptor.

Я попробовал его с RequestContextHolder.getRequestAttributes(), но результат (иногда - и это настоящая проблема) null. Я пробовал также с RequestContextHolder.currentRequestAttributes() но чем IllegalStateException брошено со следующим сообщением:

запрос Нет потока переплете не найдено: Вы имеете в виду атрибуты запроса за пределами фактического веб-запроса, или обработки запроса снаружи из изначально получающий поток? Если вы действительно работаете в веб-запросе и все еще получаете это сообщение, ваш код, вероятно, работает за пределами DispatcherServlet/DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы выставить текущий запрос.

RequestContextListener зарегистрирован в web.xml.

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

Та же проблема, когда я впрыснуть сессию в ClientHttpRequestInterceptor непосредственно.

@Autowired 
private HttpSession session; 

Мой вопрос: как я могу получить доступ в ClientHttpRequestInterceptor тока HttpSession?

Спасибо!

+0

Можете ли вы предоставить ваш ClientHttpRequestInterceptor полного класса? – developer

ответ

0

Я думаю, что использование этого ClientHttpInterceptor класса не в нужном месте, потому что, как то, что я вижу в их doc

перехватывает стороне клиента HTTP запросов. Реализации этого интерфейса могут быть зарегистрированы с RestTemplate

означает, что вы можете использовать этот перехватчик, если ваш сервер ведет себя любит клиент и, например, вы хотите изменить каждый запрос вы отправляете с RestTemplate. Пример использования для ClientHttpInterceptorhere.

Вы должны использовать HandlerInterceptor. См. Хорошую статью here.

+0

Да, мой сервер также является клиентом REST-API. Мне нужно изменить каждый запрос, добавив к нему некоторые заголовки учетных данных. Некоторым заголовкам нужна информация из сеанса, например, специальный токен пользователя. –

+0

Уверен, что метод 'preHandle'' HandlerInterceptor' имеет 'HttpServletRequest', я могу получить сеанс. Проблема в том, что мне нужно перехватить каждый запрос «RestTemplate». –

+0

просто извлеките необходимый заголовок auth из 'HandlerInterceptor', передайте его в ClientHttpInterceptor и зарегистрируйте RestTemplate с помощью' ClientHttpInterceptor'. –

1

Вы можете получить доступ к HttpSession, используя следующий в вашем ClientHttpRequestInterceptor:

public class CustomInterceptor implements ClientHttpRequestInterceptor { 
     @Override 
     public ClientHttpResponse intercept(HttpRequest request, 
              byte[] body, 
              ClientHttpRequestExecution execution) throws IOException { 
      HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); 
      // get the current session without creating a new one 
      HttpSession httpSession = httpServletRequest.getSession(false); 
      // get whatever session parameter you want 
      String sessionParam = httpSession.getAttribute("parameter") 
              .toString(); 
     } 
    } 
Смежные вопросы