Spring 3.0设置并获取会话属性

我想从会话范围中读取域对象(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"; } } 

我能够在jsp页面中使用该对象

${user.userDetails.firstName}

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

我试图读取会话属性如下:

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

您显示的代码应该有效 – 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"; } } 

接着

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

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

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

使用父类inheritance所有控制器并在那里使用SessionAttributes。 只是这个类应该在mvc的包扫描中。

可能是您没有将UserVO设置为Serializable。