Весна 3 MVC, що звертається до HttpRequest від контролера


104

Я хотів би обробити атрибути запиту та сеансу сам, а не залишити його навесні @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"; 
}

Вищеописаний метод нічого не друкує.

Чи є у вас поради з цього приводу?

Відповіді:


184

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об'єкт.

EDIT: Схоже, що HttpServletRequest / Response не працює для деяких людей в рамках Spring 3. Спробуйте використовувати об'єкти Spring WebRequest / WebResponse, як вказував Едуардо Зола.

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


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

2
Дякую @jjmontes за посилання на підтримувані аргументи Spring MVC!
Баретт

Я майже нічого не знаю про Весну, але мені довелося додати @Contextанотацію до аргументу, щоб отримати їх. Я можу щось нове, я не знаю, але подумав, що це згадаю.
ivarni

81

Я знаю, що це старе питання, але ...

Ви також можете використовувати це у своєму класі:

@Autowired
private HttpServletRequest context;

І це забезпечить поточний екземпляр, який HttpServletRequestви використовуєте у своєму методі.


7
Чи не робити це таким чином, не заважає бобі контролера бути однотонним?
jjmontes

2
Пружинні контролери завжди є однотонними.
Дейвіді Каварзан

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.