Mar*_*ark 21 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");
}
ska*_*man 25
@SessionAttribute@uthark提到的注释不适合这个任务 - 我认为它也是如此,但是一些阅读显示不然:
使用此注释指示的会话属性对应于特定处理程序的模型属性,透明地存储在会话会话中.一旦处理程序指示其会话会话完成,将删除这些属性.因此,请将此工具用于此类会话属性,这些属性应在特定处理程序的对话过程中临时存储在会话中.
对于永久会话属性,例如用户身份验证对象,请使用传统的session.setAttribute方法.或者,考虑使用通用WebRequest接口的属性管理功能.
换句话说,@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.
}
详情请见:
| 归档时间: | 
 | 
| 查看次数: | 52214 次 | 
| 最近记录: |