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"); } 

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

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

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

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

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

您可以使用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(); } 

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

是的你可以。

 @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