Доступ к объекту HttpServletRequest в обычном классе Java из Spring
У меня есть обычный Java-класс в веб-приложении Spring MVC 3.06.
В этом классе я хотел бы ввести или получить объект HttpServletRequest
в методе.
Я знаю, что могу передать это, но мне было интересно, как я могу получить запрос, не передавая его методу. Возможно, используя аннотации или подобные?
Кроме того, каковы "реальные" проблемы с получением запроса таким образом, за исключением некоторых взглядов людей на то, что это уродливое кодирование. Я имею в виду, неустойчиво ли обращаться к нему таким образом?
Предпочтительно не зависящий от сервера процесс.
Я видел
(HttpServletRequest) RequestContextHolder.getRequestContext().getExternalContext().getNativeRequest()
но это не работает для Spring MVC 3.06. RequestContextHolder
не имеет метода getRequestContext()
.
Ответы
Ответ 1
Использование
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
Я не уверен, где вы получили RequestContextHolder.getRequestContext()
, что совершенно неправильно.
Неужели неустойчиво обращаться к нему таким образом?
Нет, он достаточно стабилен, если вы всегда используете код как часть потока запросов HttpServlet
. Основная проблема заключается в том, что да, это уродливо, и это делает ваш код трудным для тестирования. Этого достаточно, чтобы не использовать его.
Если вы должны использовать его, отделите его от своего кода, например.
public void doSomething() {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
doSomething(request);
}
void doSomething(HttpServletRequest request) {
// put your business logic here, and test this method
}
Ответ 2
если вы используете Spring MVC, вы можете найти HttpServletRequest следующим образом.
@RequestMapping("/part of requesturl")
@ResponseBody String YOUR_METHOD_NAME(HttpServletRequest request)
{
String YOUR_PARAMETER = request.getParameter("YOUR_PARAETER_NAME");
}
Вы также можете вставить ответ HttpServletResponse, если хотите..
Ответ 3
@Context HttpServletRequest httpServletRequest = null;
используйте этот