Spring 3 MVC che accede a HttpRequest dal controller


104

Vorrei gestire personalmente gli attributi della richiesta e della sessione piuttosto che lasciarli a primavera @SessionAttributes, ad esempio per il login della gestione dei cookie.

Non riesco a capire come posso accedere a HttpRequestda un controller, ho bisogno di un modo per passare a un livello sopra @RequestAttributee accedere a HttpRequestse stesso. Con Stripes in usato per farlo implementando un ApplicationContexte chiamando getAttribute().

Inoltre, il passaggio del HttpServletRequestparametro as sembra non funzionare:

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

Il metodo sopra non stampa nulla.

Hai qualche consiglio in merito?

Risposte:


184

Spring MVC ti darà HttpRequest se lo aggiungi semplicemente alla firma del metodo del controller:

Per esempio:

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

}

Come puoi vedere, la semplice aggiunta degli oggetti HttpServletRequeste HttpServletResponsealla firma fa sì che Spring MVC passi quegli oggetti al metodo del controller. Anche tu vorrai l' HttpSessionoggetto.

EDIT: Sembra che HttpServletRequest / Response non funzionino per alcune persone sotto Spring 3. Prova a usare gli oggetti Spring WebRequest / WebResponse come ha sottolineato Eduardo Zola.

Ti consiglio vivamente di dare un'occhiata all'elenco degli argomenti supportati che Spring MVC è in grado di iniettare automaticamente nei metodi del gestore.


Ciao, grazie per i suggerimenti, non so cosa sto sbagliando ma non funziona: non stampa nulla: @RequestMapping (value = "/") public String home (HttpServletRequest request) {System.out. println ( "" + request.getSession () getCreationTime ().); torna a casa"; } Questo dovrebbe pring l'attuale importo pof millis ma non lo fa, anche annotando il metodo con @RequestBody non cambia nulla, qualche ulteriore consiglio? grazie per questo
JBoy

2
Grazie @jjmontes per il collegamento agli argomenti supportati da Spring MVC!
Barett

Non so quasi nulla della primavera, ma ho dovuto aggiungere l' @Contextannotazione prima dell'argomento per farli iniettare. Potrebbe essere qualcosa di nuovo, non lo so, ma ho pensato di parlarne.
ivarni

81

So che è una vecchia domanda, ma ...

Puoi anche usarlo nella tua classe:

@Autowired
private HttpServletRequest context;

E questo fornirà l'istanza corrente di HttpServletRequestper l'uso sul tuo metodo.


7
In questo modo non si impedisce al bean del controller di essere un singleton?
jjmontes

2
I controller Spring sono sempre single.
Deividi Cavarzan

16
Sembra sbagliato: cosa succede se il controller sta gestendo più di una richiesta in un dato momento? Qual è allora la richiesta "corrente"?
sbk

2
Questa domanda ha alcune spiegazioni su che stai chiedendo: stackoverflow.com/questions/17235794/...
Deividi Cavarzan

1
Sarebbe molto utile avere qualcosa come getThreadLocalRequest()in GWT RemoteServiceServletche restituisce sempre la richiesta corretta anche se viene eseguita in un ambiente altamente concorrente.
Yuriy Nakonechnyy

0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.