21 Stimmen

Spring MVC Session-Attribut-Zugriff

Gibt es eine Möglichkeit unter Frühling 3.0 auf die HttpSession zugreifen, ohne es in der Methodensignatur? Was ich wirklich tun möchte, ist in der Lage sein, in Werte aus einer HttpSession, die null sein kann übergeben.

Etwa so:

@RequestMapping("/myHomePage")
public ModelAndView show(UserSecurityContext ctx) {}

stattdessen:

@RequestMapping("/myHomePage")
public ModelAndView show(HttpSession session) {
      UserSecurityContext ctx = (UserSecurityContext) session.getAttribute("userSecurityCtx");
}

25voto

skaffman Punkte 389758

Le site @SessionAttribute Annotation, die @uthark erwähnt hat, ist für diese Aufgabe nicht geeignet - das dachte ich auch, aber eine kleine Lektüre zeigt das Gegenteil:

Sitzungsattribute wie angegeben mit diese Anmerkung angegeben werden, entsprechen den den Modellattributen eines bestimmten Handlers, werden transparent in einer Konversationssitzung gespeichert. Diese Attribute werden entfernt, sobald der Handler die Beendigung seiner Konversationssitzung anzeigt. Daher sollten Sie diese Möglichkeit für solche Gesprächsattribute Attribute, die in der Sitzung in der Sitzung zwischengespeichert werden sollen während des Verlaufs eines bestimmten Konversation des Handlers gespeichert werden sollen.

Für permanente Sitzungsattribute, z.B. ein Benutzerauthentifizierungsobjekt, verwenden Sie die traditionelle session.setAttribute Methode stattdessen. Alternativ dazu, erwägen Sie die Verwendung der Attribut Management Fähigkeiten der generischen WebRequest-Schnittstelle.

Mit anderen Worten, @SessionAttribute ist für die Speicherung von Konversation MVC-Modell-Objekte in der Sitzung (im Gegensatz zu speichern sie als Anforderung Attribute). Es ist nicht für die Verwendung mit beliebigen Session-Attributen gedacht. Wie Sie entdeckt haben, funktioniert es nur, wenn das Session-Attribut immer vorhanden ist.

Mir ist keine andere Alternative bekannt, ich denke, Sie müssen sich mit HttpSession.getAttribute()

8voto

axtavt Punkte 233070

Sie können eine RequestContextHolder :

class SecurityContextHolder {
    public static UserSecurityContext currentSecurityContext() {
        return (UserSecurityContext) 
            RequestContextHolder.currentRequestAttributes()
            .getAttribute("userSecurityCtx", RequestAttributes.SCOPE_SESSION));
    }
}
...
@RequestMapping("/myHomePage")           
public ModelAndView show() {           
    UserSecurityContext ctx = SecurityContextHolder.currentSecurityContext();
}

Für bereichsübergreifende Belange wie die Sicherheit ist dieser Ansatz besser, da Sie Ihre Controller-Signaturen nicht ändern müssen.

5voto

uthark Punkte 5223

Ja, das können Sie.

@SessionAttributes("userSecurityContext")
public class UserSecurityContext {
}

@RequestMapping("/myHomePage")
public String show(@ModelAttribute("userSecurityContext") UserSecurityContext u) {
    // code goes here.
}

Siehe Einzelheiten:

  1. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/SessionAttributes.html

  2. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X