Spring 3 MVC greift vom Controller auf HttpRequest zu

103

Ich möchte Anforderungs- und Sitzungsattribute selbst bearbeiten, anstatt sie dem Frühling zu überlassen @SessionAttributes, beispielsweise zum Anmelden bei der Behandlung von Cookies.

Ich kann nur nicht herausfinden, wie ich HttpRequestvon einem Controller aus auf das @RequestAttributezugreifen HttpRequestkann. Ich brauche einen Weg, um eine Ebene über das zu gehen und auf das selbst zuzugreifen . Mit Stripes wird dies verwendet, indem ein ApplicationContextund aufgerufen wird getAttribute().

Außerdem HttpServletRequestscheint das Übergeben des as-Parameters nicht zu funktionieren:

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

Die obige Methode druckt nichts.

Hast du einen Rat dazu?

JBoy
quelle

Antworten:

183

Spring MVC gibt Ihnen die HttpRequest, wenn Sie sie nur zu Ihrer Signatur für die Controller-Methode 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, das Hinzufügen einfach die HttpServletRequestund HttpServletResponseObjekte in die Signatur macht Spring MVC diese Objekte in Ihrer Controller - Methode zu übergeben. Du wirst das HttpSessionObjekt auch wollen.

BEARBEITEN: Es scheint, dass HttpServletRequest / Response unter Spring 3 für einige Benutzer 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 einfügen kann.

jjmontes
quelle
Hallo, danke für die Hinweise, ich weiß nicht, was ich falsch mache, aber das funktioniert nicht: Es gibt nichts aus: @RequestMapping (value = "/") public String home (HttpServletRequest-Anforderung) {System.out. println ("" + request.getSession (). getCreationTime ()); nach Hause zurückkehren"; } Dies sollte den aktuellen Betrag von Millis pring, tut es aber nicht, auch das Annotieren der Methode mit @RequestBody ändert nichts, irgendwelche weiteren Ratschläge? Danke dafür
JBoy
2
Vielen Dank an @jjmontes für den Link zu den von Spring MVC unterstützten Argumenten!
Barett
Ich weiß so gut wie nichts über Spring, aber ich musste die @ContextAnmerkung vor dem Argument hinzufügen , um sie injizieren zu lassen. Könnte etwas Neues sein, weiß ich nicht, aber ich dachte, ich würde es erwähnen.
ivarni
81

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

Sie können dies auch in Ihrer Klasse verwenden:

@Autowired
private HttpServletRequest context;

Und dies liefert die aktuelle Instanz, die HttpServletRequestSie für Ihre Methode verwenden.

Deividi Cavarzan
quelle
7
Verhindert dies nicht, dass die Controller-Bean ein Singleton ist?
Jjmontes
2
Federregler sind immer Singletons.
Deividi Cavarzan
16
Das fühlt sich falsch an - was ist, wenn der Controller gleichzeitig mehr als eine Anfrage bearbeitet? Was ist dann "aktuelle" Anfrage?
sbk
2
Diese Frage hat einige Erklärungen, nach denen Sie fragen: stackoverflow.com/questions/17235794/…
Deividi Cavarzan
1
Es wäre sehr nützlich, so etwas wie getThreadLocalRequest()in GWTs zu haben, RemoteServiceServletdas immer die richtige Anforderung zurückgibt, selbst wenn es in einer Umgebung mit hoher gleichzeitiger Ausführung ausgeführt wird.
Yuriy Nakonechnyy
0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
SaiSudha HG
quelle