Spring 3 MVC доступ к HttpRequest из контроллера


105

Я хотел бы сам обрабатывать запросы и атрибуты сеанса, а не оставлять это на весну @SessionAttributes, например, для входа в систему обработки файлов cookie.

Я просто не могу понять, как я могу получить доступ к HttpRequestизнутри контроллера, мне нужен способ перейти на уровень выше @RequestAttributeи получить доступ к HttpRequestсамому себе. При использовании Stripes для этого используется ApplicationContextвызов и getAttribute().

Кроме того, передача HttpServletRequestпараметра as, похоже, не работает:

@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println(""+request.getSession().getCreationTime());
    return "home"; 
}

Вышеупомянутый метод ничего не печатает.

У вас есть какие-нибудь советы по этому поводу?

Ответы:


185

Spring MVC предоставит вам HttpRequest, если вы просто добавите его в подпись метода контроллера:

Например:

/**
 * Generate a PDF report...
 */
@RequestMapping(value = "/report/{objectId}", method = RequestMethod.GET)
public @ResponseBody void generateReport(
        @PathVariable("objectId") Long objectId, 
        HttpServletRequest request, 
        HttpServletResponse response) {

    // ...
    // Here you can use the request and response objects like:
    // response.setContentType("application/pdf");
    // response.getOutputStream().write(...);

}

Как вы видите, просто добавляя HttpServletRequestи HttpServletResponseобъекты в подписи делает Spring MVC , чтобы передать эти объекты в ваш метод контроллера. Вам тоже понадобится HttpSessionобъект.

РЕДАКТИРОВАТЬ: Похоже, что HttpServletRequest / Response не работают для некоторых людей в Spring 3. Попробуйте использовать объекты Spring WebRequest / WebResponse, как указал Эдуардо Зола.

Я настоятельно рекомендую вам взглянуть на список поддерживаемых аргументов, которые Spring MVC может автоматически вводить в методы вашего обработчика.


Привет, спасибо за подсказки, я не знаю, что я делаю не так, но это не работает: он ничего не печатает: @RequestMapping (value = "/") public String home (запрос HttpServletRequest) {System.out. println ("" + request.getSession (). getCreationTime ()); вернуться домой"; } Это должно оценить текущую сумму pof миллис, но это не так. Также аннотирование метода с помощью @RequestBody ничего не меняет, какие-либо дополнительные советы? спасибо за это
JBoy

2
Спасибо @jjmontes за ссылку на аргументы, поддерживаемые Spring MVC!
Баретт

Я почти ничего не знаю о Spring, но мне пришлось добавить @Context аннотацию перед аргументом, их. Может быть что-то новое, я не знаю, но решил, что упомяну об этом.
ivarni 08

81

Я знаю, что это старый вопрос, но ...

Вы также можете использовать это в своем классе:

@Autowired
private HttpServletRequest context;

И это предоставит вам текущий экземпляр, который HttpServletRequestвы используете в своем методе.


7
Разве это не мешает bean-компоненту контроллера быть одноэлементным?
jjmontes

2
Контроллеры Spring всегда синглтоны.
Deividi Cavarzan

16
Это неправильно - что, если контроллер обрабатывает более одного запроса в данный момент? Что же тогда такое «текущий» запрос?
sbk

2
В этом вопросе есть некоторые пояснения о том, о чем вы просите: stackoverflow.com/questions/17235794/…
Deividi Cavarzan

1
Было бы очень полезно иметь что-то вроде getThreadLocalRequest()GWT, RemoteServiceServletкоторый всегда возвращает правильный запрос, даже если он выполняется в среде с высокой степенью параллелизма.
Юрий Наконечный

0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.