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"; 
}

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

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

JBoy
источник

Ответы:

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 может автоматически вводить в методы вашего обработчика.

jjmontes
источник
Привет, спасибо за подсказки, я не знаю, что я делаю не так, но это не работает: он ничего не печатает: @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"; 
}
SaiSudha HG
источник