Spring 3 MVC uzyskuje dostęp do HttpRequest z kontrolera

105

Chciałbym samodzielnie obsługiwać atrybuty żądań i sesji, a nie pozostawić to na wiosnę @SessionAttributes, na przykład do logowania do obsługi plików cookie.

Po prostu nie mogę dowiedzieć się, w jaki sposób mogę uzyskać dostęp do HttpRequestkontrolera, potrzebuję sposobu, aby przejść do warstwy powyżej @RequestAttributei uzyskać dostęp do HttpRequestsiebie. Używając Stripes, robimy to przez implementację ApplicationContexti wywołanie getAttribute().

HttpServletRequestWydaje się , że przekazywanie parametru as nie działa:

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

Powyższa metoda niczego nie drukuje.

Czy masz jakieś rady w tej sprawie?

JBoy
źródło

Odpowiedzi:

185

Spring MVC da ci HttpRequest, jeśli po prostu dodasz go do podpisu metody kontrolera:

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 dodanie obiektów HttpServletRequesti HttpServletResponsedo podpisu powoduje, że Spring MVC przekazuje te obiekty do metody kontrolera. Ten HttpSessionobiekt też będziesz chciał .

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

Zdecydowanie zalecamy zapoznanie się z listą obsługiwanych argumentów, które Spring MVC może automatycznie wstrzyknąć do metod obsługi.

jjmontes
źródło
Cześć, dzięki za podpowiedzi, nie wiem, co robię źle, ale to nie działa: nic nie drukuje: @RequestMapping (value = "/") public String home (żądanie HttpServletRequest) {System.out. println ("" + request.getSession (). getCreationTime ()); wrócić do domu"; } Powinno to spowodować podanie bieżącej kwoty pof milis, ale tak nie jest, również dodanie adnotacji do metody @RequestBody nic nie zmienia, jakieś dalsze porady? dzięki za to
JBoy
2
Dzięki @jjmontes za link do obsługiwanych argumentów Spring MVC!
Barett
Prawie nic nie wiem o Spring, ale musiałem dodać @Contextadnotację przed argumentem, aby je wstrzyknąć. To może być coś nowego, nie wiem, ale pomyślałem, że o tym wspomnę.
ivarni
81

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

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

@Autowired
private HttpServletRequest context;

Zapewni to bieżącą instancję HttpServletRequestużywaną w Twojej metodzie.

Deividi Cavarzan
źródło
7
Czy zrobienie tego w ten sposób nie zapobiega temu, by fasola kontrolera była singletonem?
jjmontes
2
Kontrolery sprężyn są zawsze singletonami.
Deividi Cavarzan
16
Wydaje się to niewłaściwe - co, jeśli administrator obsługuje więcej niż jedno żądanie w danym czasie? Co to jest „aktualne” żądanie?
sbk
2
To pytanie ma kilka wyjaśnień, o które prosisz: stackoverflow.com/questions/17235794/…
Deividi Cavarzan
1
Byłoby całkiem przydatne mieć coś takiego jak getThreadLocalRequest()w GWT, RemoteServiceServletktóre zawsze zwraca poprawne żądanie, nawet jeśli jest wykonywane w wysoce współbieżnym środowisku.
Yuriy Nakonechnyy
0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
SaiSudha HG
źródło