web-dev-qa-db-fra.com

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

Je voudrais gérer moi-même les attributs de requête et de session plutôt que de le laisser ressort @SessionAttributes, pour le login des cookies manipulant par exemple.

Je n'arrive pas à comprendre comment accéder à la HttpRequest à partir d'un contrôleur. J'ai besoin d'un moyen de passer d'une couche au-dessus de @RequestAttribute et d'accéder à la HttpRequest elle-même. Pour ce faire, Stripes est utilisé en implémentant un ApplicationContext et en appelant getAttribute().

De plus, passer le paramètre HttpServletRequest en tant que paramètre ne semble 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?

88
JBoy

Spring MVC vous donnera le HttpRequest si vous venez de l’ajouter à la signature de votre 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, le simple fait d'ajouter les objets HttpServletRequest et HttpServletResponse à la signature permet à Spring MVC de transmettre ces objets à votre méthode de contrôleur. Vous voudrez aussi l’objet HttpSession.

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

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

165
jjmontes

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

Vous pouvez également l'utiliser dans votre classe:

@Autowired
private HttpServletRequest context;

Et cela fournira l'instance actuelle de HttpServletRequest que vous utiliserez avec votre méthode.

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