Spring 3 MVC accédant à HttpRequest à partir du contrôleur

104

Je souhaite gérer moi-même les attributs de requête et de session plutôt que de le laisser au printemps @SessionAttributes, pour la connexion de la gestion des cookies par exemple.

Je n'arrive pas à comprendre comment pourrais-je accéder au HttpRequestdepuis un contrôleur, j'ai besoin d'un moyen de passer une couche au-dessus de @RequestAttributeet d'accéder à HttpRequestlui - même. Avec Stripes utilisé pour le faire en implémentant un ApplicationContextet en appelant getAttribute().

De plus, la transmission du HttpServletRequestparamètre as semble ne pas fonctionner:

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

La méthode ci-dessus n'imprime rien.

Avez-vous des conseils à ce sujet?

JBoy
la source

Réponses:

184

Spring MVC vous donnera la HttpRequest si vous l'ajoutez simplement à votre signature de méthode de contrôleur:

Par exemple:

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

}

Comme vous le voyez, ajouter simplement les objets HttpServletRequestet HttpServletResponseà la signature oblige Spring MVC à transmettre ces objets à votre méthode de contrôleur. Vous voudrez leHttpSession objet.

EDIT: Il semble que HttpServletRequest / Response ne fonctionne pas pour certaines personnes sous Spring 3. Essayez d'utiliser des objets Spring WebRequest / WebResponse comme l'a souligné Eduardo Zola.

Je vous recommande vivement de consulter la liste des arguments pris en charge que Spring MVC est capable d'injecter automatiquement par magie dans vos méthodes de gestionnaire.

jjmontes
la source
Salut, merci pour les indices, je ne sais pas ce que je fais mal mais cela ne fonctionne pas: il n'imprime rien: @RequestMapping (value = "/") public String home (requête HttpServletRequest) {System.out. println ("" + request.getSession (). getCreationTime ()); rentrer à la maison"; } Cela devrait pring le montant actuel pof millis mais ce n'est pas le cas, annoter également la méthode avec @RequestBody ne change rien, aucun autre conseil? merci pour cela
JBoy
2
Merci @jjmontes pour le lien vers les arguments pris en charge par Spring MVC!
Barett
Je ne sais presque rien sur Spring, mais j'ai dû ajouter l' @Contextannotation avant l'argument afin de les faire injecter. Ça pourrait être quelque chose de nouveau, je ne sais pas, mais j'ai pensé que je le mentionnerais.
ivarni
81

Je sais que c'est une vieille question, mais ...

Vous pouvez également utiliser ceci dans votre classe:

@Autowired
private HttpServletRequest context;

Et cela fournira l'instance actuelle de HttpServletRequestpour que vous utilisiez sur votre méthode.

Deividi Cavarzan
la source
7
Le faire de cette façon n'empêche-t-il pas le bean contrôleur d'être un singleton?
jjmontes
2
Les contrôleurs de ressort sont toujours des singletons.
Deividi Cavarzan
16
Cela semble faux - que se passe-t-il si le contrôleur traite plus d'une demande à la fois? Qu'est-ce que la demande «actuelle» alors?
sbk
2
Cette question a quelques explications sur ce que vous demandez: stackoverflow.com/questions/17235794/…
Deividi Cavarzan
1
Il serait très utile d'avoir quelque chose comme getThreadLocalRequest()dans GWT RemoteServiceServletqui renvoie toujours une requête correcte même si elle est exécutée dans un environnement hautement concurrentiel.
Yuriy Nakonechnyy
0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
SaiSudha HG
la source