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. }
详情请见: