【问题标题】:properly use session in spring mvc在spring mvc中正确使用会话
【发布时间】:2016-07-28 02:37:19
【问题描述】:

我使用 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;
}

}

【问题讨论】:

  • 您能解释一下您已经尝试过什么以及其中的不足之处吗?
  • 我尝试使用 @SessionAttributes 注释,并将数据保存在 Model 类中,例如model.setAttribute("objName",obj);或使用类 ModelAndView...但我听说这不是好方法...在我们的项目中,我们没有使用 spring 的人,我不能问别人
  • 您能否在主帖中发布一些代码,这将有助于更好地理解。

标签: java spring spring-mvc session


【解决方案1】:

首先,会话属性不是存储用户对象的好选择。由 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);

【讨论】:

    【解决方案2】:

    你可以把你的用户对象放在会话中,然后在你的项目中到处使用它。但是,如果您有很多用户,这意味着您的服务器内存中有很多用户对象。内存可能会耗尽。

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

    提醒一下,您应该在不需要时调用 status.setComplete() 来清除会话中的属性。

    Does SessionStatus object.setComplete() clears all the session attributes or just work for the controller in which it is used?

    如果你不知道怎么用,可以看下面的文章

    http://vard-lokkur.blogspot.tw/2011/01/spring-mvc-session-attributes-handling.html

    【讨论】:

    • 如果我将 JSESSIONID 保留在 Model 中,如何在会话完成时删除某些 JSESSIONID?我可以在某个地方设置超时,或者我必须在某个线程的代码中跟踪它?
    • 会话。无效()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多