#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 смотрите вторую часть майского ансера