Spring 3.0设置并获取会话属性

bin*_*ary 14 java spring session-variables

我想从会话范围中读取域对象(UserVO).

我在名为WelcomeController的控制器中设置UserVO

@Controller
@RequestMapping("/welcome.htm")
public class WelcomeController {
@RequestMapping(method = RequestMethod.POST)
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){
      User user = loginService.loginUser(loginCredentials);
     session.setAttribute("user", user);
         return "loginSuccess";
    }
}
Run Code Online (Sandbox Code Playgroud)

我能够在jsp页面中使用该对象 <h1>${user.userDetails.firstName}</h1>

但是我无法从另一个Controller中读取值,

我正在尝试读取session属性,如下所示:

@Controller
public class InspectionTypeController {
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST )
 public String addInspectionType(InspectionType inspectionType, HttpSession session)
 {
           User user = (User) session.getAttribute("user");
           System.out.println("User: "+ user.getUserDetails().getFirstName);

        }
} 
Run Code Online (Sandbox Code Playgroud)

ska*_*man 40

您显示的代码应该起作用 - 在HttpSession控制器之间共享,并且您使用相同的属性名称.因此,你没有向我们展示其他错误.

但是,无论它是否有效,Spring都提供了一种更优雅的方法,使用@SessionAttribute注释将模型对象保留在会话中(请参阅文档).

例如(我没有测试过这个,但它给你的想法):

@Controller
@RequestMapping("/welcome.htm")
@SessionAttributes({"user"})
public class WelcomeController {
    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(ModelMap modelMap){
       User user = loginService.loginUser(loginCredentials);
       modelMap.addtAttribute(user);
       return "loginSuccess";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

@Controller
@SessionAttributes({"user"})
public class InspectionTypeController {

   @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST )
   public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) {
      System.out.println("User: "+ user.getUserDetails().getFirstName);
   }
} 
Run Code Online (Sandbox Code Playgroud)

但是,如果您的原始代码不起作用,那么这也不起作用,因为您的会话出现了其他问题.

  • @Andy看到我对karpaczio的回答的评论 (2认同)

小智 6

@SessionAttributes仅在特定处理程序的上下文中起作用,因此WelcomeController中的属性集仅在此控制器中可见.

  • 您所说的是Spring版本<= 3.1.2.RELEASE的情况.从3.1.2.RELEASE开始,@ SessionAttributes按预期保存在不同的控制器中 (6认同)
  • @Denis Kniazhev见[这里](http://docs.spring.io/spring-framework/docs/3.2.0.M2/api/org/springframework/web/bind/annotation/SessionAttributes.html)使用SessionAttributes这样的会话属性,应该在特定处理程序的对话过程中临时存储在会话中.对于永久会话属性,例如用户身份验证对象,请使用传统的session.setAttribute方法. (2认同)