2011-12-14 16 views
66

Ja sam chciałbym obsługiwać żądania i atrybuty sesji, a następnie zostawić je na wiosnę @SessionAttributes, w celu logowania się na przykład przy obsłudze plików cookie.Spring 3 MVC uzyskujący dostęp do HttpRequest ze sterownika

Po prostu nie mogę dowiedzieć się, jak mogę uzyskać dostęp do HttpRequest z poziomu kontrolera, potrzebuję sposobu, aby przejść warstwę powyżej @RequestAttribute i uzyskać dostęp do samej HttpRequest. W tym celu użyj Pasków, wykonując ApplicationContext i wywołując getAttribute().

Ponadto, mijając HttpServletRequest jako parametr nie wydaje się działać:

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

Powyższa metoda nic nie drukuje.

Czy masz jakieś porady na ten temat?

Odpowiedz

133

Wiosna MVC daje HttpRequest jeśli po prostu dodać go do kontrolera metoda podpis:

Na przykład:

/** 
* 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(...); 

} 

Jak widać, po prostu dodając HttpServletRequest i HttpServletResponse obiektów do podpisu sprawia, że ​​Spring MVC przekazuje te obiekty do metody kontrolera. Będziesz także potrzebował obiektu .

EDYTOWANIE: Wygląda na to, że HttpServletRequest/Response nie działa dla niektórych osób z Wiosny 3. Spróbuj użyć obiektów Spring WebRequest/WebResponse, jak wskazał Eduardo Zola.

Gorąco polecam, aby rzucić okiem na list of supported arguments, że Spring MVC jest w stanie automatycznie magicznie wstrzykiwać się do metod obsługi.

+0

Cześć, thx za podpowiedzi, nie wiem co robię źle, ale to nie działa: To nie ma nic drukuje: \t @RequestMapping (wartość = „/”) \t public String domu (HttpServletRequest żądania) { \t \t \t System.out.println ("" + request.getSession(). GetCreationTime()); \t \t \t powrót "do domu"; \t \t \t} To powinno zadziałać na bieżącą kwotę pof millis, ale tak się nie dzieje, a także adnotacja metody z @RequestBody nic nie zmienia, jakakolwiek dalsza porada? thx dla tego – JBoy

+1

I sekundę JBoy też, to nie działa –

+1

Dzięki @jjmontes za link do wspieranych argumentów Spring MVC! – Barett

53

wiem, że to stare pytanie, ale ...

Można również użyć w swojej klasie:

@Autowired 
private HttpServletRequest context; 

A to zapewni bieżące wystąpienie HttpServletRequest do korzystania na swoje metoda.

+3

Czy robi to w ten sposób, aby komponent bean kontrolera nie był singletonem? – jjmontes

+1

Kontrolery sprężyn są zawsze pojedyncze. –

+7

To źle działa - a co jeśli kontroler obsługuje więcej niż jedno żądanie w danym momencie? Jakie jest zatem żądanie "bieżące"? – sbk

Powiązane problemy