126 votes

Spring 3 MVC accède à HttpRequest depuis le contrôleur

J'aimerais gérer moi-même les attributs des requêtes et des sessions plutôt que de les confier à Spring. @SessionAttributes pour la connexion à la gestion des cookies par exemple.

Je n'arrive pas à comprendre comment je peux accéder à la base de données des HttpRequest à partir d'un contrôleur, j'ai besoin d'un moyen d'aller une couche au-dessus de l'interface utilisateur. @RequestAttribute et accéder à la HttpRequest même. Avec les Stripes, il était possible de le faire en implémentant une fonction ApplicationContext et en appelant getAttribute() .

De même, le passage de la HttpServletRequest comme paramètre 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 ?

223voto

jjmontes Points 1965

Spring MVC vous donnera le HttpRequest si vous l'ajoutez simplement à la signature de la méthode de votre 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, il suffit d'ajouter le HttpServletRequest y HttpServletResponse à la signature permet à Spring MVC de transmettre ces objets à la méthode de votre contrôleur. Vous voudrez que la signature HttpSession également.

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

Je vous recommande vivement de jeter un coup d'œil sur le site web de la Commission européenne. liste des arguments soutenus que Spring MVC est capable d'injecter automatiquement dans vos méthodes de traitement.

90voto

Deividi Cavarzan Points 2302

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

Vous pouvez également l'utiliser dans votre classe :

@Autowired
private HttpServletRequest context;

Cela fournira l'instance actuelle de HttpServletRequest pour l'utilisation de votre méthode.

4voto

sendon1982 Points 610

Une autre solution consiste à utiliser RequestContextHolder comme : (Depuis : 2.0)

Classe RequestContextHolder permettant d'exposer la requête web sous la forme d'un objet RequestAttributes lié à un thread. La demande sera héritée par tous les threads enfants engendrés par le thread actuel si l'indicateur d'héritabilité est fixé à true.

HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

0voto

SaiSudha HG Points 1
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X