Java 在SpringMVC中正确使用会话

Java 在SpringMVC中正确使用会话,java,spring,spring-mvc,session,Java,Spring,Spring Mvc,Session,我使用Spring 4.1.1。我必须为用户会话提供服务。存储用户会话相关数据的最佳方式是什么?我读了这么多的方法,但我不明白哪种方法是正确的 这是我需要的例子 @Controller @SessionAttributes("user") public class PagesController { @RequestMapping(value="/sign_in", method = RequestMethod.POST) public String getSignIn(@RequestPara

我使用Spring 4.1.1。我必须为用户会话提供服务。存储用户会话相关数据的最佳方式是什么?我读了这么多的方法,但我不明白哪种方法是正确的

这是我需要的例子

@Controller
@SessionAttributes("user")
public class PagesController {
@RequestMapping(value="/sign_in", method = RequestMethod.POST)
public String getSignIn(@RequestParam(value="user")String user ,
                        @RequestParam(value="pass")String password,
                        Model model) {
    UserDAO dao = new UserDao();
    if(dao.isUserValid(user,password) && !model.containsAttribute("user")){
        User user = new User();
        model.addAttribute("user",user);
        return USER_PAGE;
    }
    return LOGIN_PAGE;
}

}

将用户对象放入会话中,然后在项目中的任何地方都使用它是可以的。但是,如果您有很多用户,这意味着您的服务器内存中有很多用户对象。内存可能会用完

另一种方法是通过加密和验证将一些用户信息放入cookie中,但请记住不要在cookie中放入太多信息,因为每次发出请求或响应时都会发送cookie。如果要发送的信息太多,则会减慢响应时间

作为提醒,您应该调用status.setComplete()来清除会话中不需要的属性

如果你不知道如何使用它,你可以看到下面的文章


首先,会话属性不是存储用户对象的好选项。由spring决定何时清除会话属性数据。根据spring文档,spring在理解“对话”已完成时删除会话属性。仅当您在控制器作用域中并且数据临时需要存储在会话中时,才使用会话属性

就用户登录对象而言,您需要做的事情是使用http sesison。当您登录/登录到应用程序时,实际上是将登录凭据发布到控制器。验证后,您将用户对象(带有尽可能少的必要信息-放入对象并存储到会话中)放入。只要该对象没有过期,或者在用户触发注销时将其清除,该对象就会保留

此外,如果您仍然希望使用SessionAttribute存储用户对象。然后,当您将应用程序部署到集群环境时,可能会出现进一步的问题。除非实现粘性会话,否则必须将会话复制到服务器的每个实例。复制httpsession是最简单的任务,而复制sessionAttribute的相同实例则不是

    @RequestMapping(value = "login.html", method = RequestMethod.POST)
    public ModelAndView post(@ModelAttribute("login") LoginEntity login, HttpServletRequest req) {


... process the data ...
if passed put it into session:

HttpSession session = req.getSession(true);
UserObject userObject=new UserObject();
userObject.setName(login.getUserName());
...

session.setAttribute("user",userObject);

你能解释一下你已经尝试过什么以及其中的缺点吗?我尝试使用@SessionAttributes注释,并将数据保存在类模型中,例如Model.setAttribute(“objName”,obj);或者使用类ModelAndView…但我听说这不是一个好方法…在我们的项目中,我们没有与spring一起工作的人员,我不能问任何人你能在你的主要帖子中发布一些代码,这将有助于更好地理解。如果我将JSSessionID保留在模型中,我如何在会话完成时删除某些JSSessionID?我可以在哪里设置超时,或者我必须在某个线程会话的代码中跟踪超时。使无效