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?

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.


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.


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"; 
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.