有没有办法在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");
}
答案 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.
}
详见: