Spring 3 MVC обращается к HttpRequest с контроллера - PullRequest
83 голосов
/ 14 декабря 2011

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

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

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

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

Приведенный выше метод ничего не печатает.

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

Ответы [ 3 ]

160 голосов
/ 14 декабря 2011

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

66 голосов
/ 11 апреля 2013

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

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

@Autowired
private HttpServletRequest context;

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

0 голосов
/ 13 июня 2019
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
...