Spring 3 MVC, получающий HttpRequest от контроллера

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

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

Кроме того, передача параметра HttpServletRequest как, кажется, не работает:

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

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

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

Ответ 1

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

Ответ 2

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

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

@Autowired
private HttpServletRequest context;

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

Ответ 3

@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}