2011-12-14 4 views
66

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

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

Также прохождения HttpServletRequest в качестве параметра, кажется, не работает:

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

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

У вас есть совет по этому вопросу?

ответ

133

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 не работают для некоторых людей весной 3. Попробуйте использовать объекты Spring WebRequest/WebResponse, как указал Эдуардо Зола.

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

+0

Привет, ТНХ для намеков, я не знаю, что я делаю неправильно, но это не работает: он не печатает ничего: \t @RequestMapping (значение = «/») \t общественного Строка дома (HttpServletRequest запрос) { \t \t \t System.out.println ("" + request.getSession(). GetCreationTime()); \t \t \t \t возвращение "home"; \t \t \t} Это должно указывать текущую сумму pof millis, но это не так, но аннотирование метода с помощью @RequestBody ничего не изменит, никаких дальнейших советов? thx для этого – JBoy

+1

I второй JBoy тоже, он не работает –

+1

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

53

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

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

@Autowired 
private HttpServletRequest context; 

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

+3

Не делает ли это так, чтобы контрольный компонент не являлся одиночным? – jjmontes

+1

Весенние контроллеры всегда однотонные. –

+7

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

Смежные вопросы