Spring MVC会话属性访问

Mar*_*ark 21 java spring spring-mvc

有没有办法在spring 3.0下访问HttpSession而不将其包含在方法签名中?我真正想做的是能够传递来自可以为空的HttpSession的值.

像这样的东西:

@RequestMapping("/myHomePage")
public ModelAndView show(UserSecurityContext ctx) {}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

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

ska*_*man 25

@SessionAttribute@uthark提到的注释不适合这个任务 - 我认为它也是如此,但是一些阅读显示不然:

使用此注释指示的会话属性对应于特定处理程序的模型属性,透明地存储在会话会话中.一旦处理程序指示其会话会话完成,将删除这些属性.因此,请将此工具用于此类会话属性,这些属性应在特定处理程序的对话过程中临时存储在会话中.

对于永久会话属性,例如用户身份验证对象,请使用传统的session.setAttribute方法.或者,考虑使用通用WebRequest接口的属性管理功能.

换句话说,@SessionAttribute用于在会话中存储会话MVC模型对象(而不是将它们存储为请求属性).它不适用于任意会话属性.正如您所发现的那样,它仅在会话属性始终存在时才有效.

我不知道任何其他选择,我认为你坚持 HttpSession.getAttribute()


axt*_*avt 8

你可以使用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();
}
Run Code Online (Sandbox Code Playgroud)

对于诸如安全性之类的跨领域问题,这种方法更好,因为您不需要修改控制器签名.


uth*_*ark 5

是的你可以.

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

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

详情请见:

  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

  • 对不起,当我将@SessionAttributes("userSecurityContext")添加到控制器时,这确实结束了.简单地将它添加到实际的UserSecurityContext pojo中并没有为我做任何事情.但是,当属性为null时,Spring会抛出异常,这是我要避免的.org.springframework.web.HttpSessionRequiredException:需要会话属性'userSecurityContext' - 在会话中找不到 (3认同)