Spring MVC会话属性访问

时间:2010-02-06 17:34:00

标签: java spring spring-mvc

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

这样的事情:

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

而不是:

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

3 个答案:

答案 0 :(得分:25)

@uthark提到的@SessionAttribute注释不适用于此任务 - 我认为也是如此,但bit of reading显示其他情况:

  

使用指示的会话属性   这个注释对应一个   特定处理程序的模型属性,   透明地存储在一个   会话会话。那些   属性将被删除一次   处理程序表示其完成   会话会话。因此,使用   这种对话的设施   应该是的属性   暂时存储在会话中   在特定的过程中   处理程序的谈话。

     

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

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

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

困住了

答案 1 :(得分: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();
}

对于安全等跨领域问题,这种方法更好,因为您不需要修改控制器签名。

答案 2 :(得分:5)

是的,你可以。

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

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

详见:

  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