Как получить информацию о HTTP-запросе в стеке метода обработчика Spring framework

#java #spring

Вопрос:

Есть ли способ получить информацию о HTTP-запросе из метода в стеке вызовов метода обработчика запроса Spring?

Другими словами, учитывая, что у меня есть метод обработчика, такой как:

 @GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
  MyInternalClass.doSomeAction();
  return String.format("Hello %s!", name);
}
 

Я ищу средства для получения информации о HTTP-запросе (например, URL, заголовки и т.д.) В коде doSomeAction() статического метода в MyInternalClass классе.

Ограничение заключается в том, что я не могу изменить исходный метод ( hello() ).

Комментарии:

1. docs.spring.io/spring-framework/docs/current/reference/html/…

Ответ №1:

Вы можете добавить параметр запроса типа HttpServletRequest

 @GetMapping("/hello")
public String hello(
   @RequestParam(value = "name", defaultValue = "World") String name,
   HttpServletRequest originalRequest) {
  // HERE: call another method here
  return String.format("Hello %s!", name);
}
 

Ознакомьтесь со справочной документацией Spring, Глава «Аргументы метода»


Часть 2

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

Вы можете использовать RequestContextHolder для получения атрибутов запроса.

 HttpServletRequest request = 
      ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
                .getRequest();
 

RequestContextHolder.getRequestAttributes() это статический метод, который может быть вызван из любого места (даже для класса, который не является компонентом Spring). Но требуется, чтобы он вызывался из потока, который был инициирован HTTP-запросом.

Комментарии:

1. Спасибо тебе, @Ralph. Однако я искал метод, который не заставлял бы разработчиков изменять свой код. Я постараюсь добавить пример к своему вопросу, чтобы он был более подробным.

2. @LeoY смотрите вторую часть майского ансера