wake-up-neo.com

Spring 3 MVC greift vom Controller auf HttpRequest zu

Ich möchte die Anforderungs- und Sitzungsattribute selbst behandeln, anstatt sie dem Frühling @SessionAttributes Zu überlassen, zum Beispiel für die Anmeldung von Cookies.

Ich kann nur nicht herausfinden, wie ich von einem Controller aus auf den HttpRequest zugreifen kann. Ich brauche einen Weg, um eine Ebene über dem @RequestAttribute Zu erreichen und auf den HttpRequest selbst zuzugreifen. Mit Stripes wird dazu ein ApplicationContext implementiert und getAttribute() aufgerufen.

Auch die Übergabe des Parameters HttpServletRequest als scheint nicht zu funktionieren:

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

Die obige Methode druckt nichts.

Haben Sie hierzu einen Rat?

88
JBoy

Spring MVC gibt Ihnen den HttpRequest, wenn Sie ihn nur zu Ihrer Controller-Methodensignatur hinzufügen:

Zum Beispiel:

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

}

Wie Sie sehen, werden diese Objekte durch einfaches Hinzufügen der Objekte HttpServletRequest und HttpServletResponse zur Signatur von Spring MVC an Ihre Controllermethode übergeben. Sie wollen auch das Objekt HttpSession.

BEARBEITEN: Es scheint, dass HttpServletRequest/Response für einige Benutzer unter Spring 3 nicht funktioniert. Versuchen Sie, Spring WebRequest/WebResponse-Objekte zu verwenden, wie Eduardo Zola hervorhob.

Ich empfehle Ihnen dringend, sich die Liste der unterstützten Argumente anzusehen, die Spring MVC automatisch in Ihre Handler-Methoden einbinden kann.

165
jjmontes

Ich weiß, das ist eine alte Frage, aber ...

Sie können dies auch in Ihrer Klasse verwenden:

@Autowired
private HttpServletRequest context;

Dadurch wird die aktuelle Instanz von HttpServletRequest für Ihre Methode bereitgestellt.

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