【问题标题】:How to create a new session in spring?如何在春季创建一个新会话?
【发布时间】:2012-04-22 00:07:27
【问题描述】:

我正在使用带有 jsf 的 spring 3(注释),并且我知道如何创建会话以及之后如何使其无效...

所以当我登录并在最后使用注销按钮时,一切都很好。但问题是,如果我不单击注销按钮,会话仍然存在。如果我现在使用其他用户登录,则旧会话数据仍然存在 - 因为旧会话没有失效。

如果旧会话没有失效,我如何强制系统创建新会话?

【问题讨论】:

    标签: java spring session


    【解决方案1】:

    您应该在用户登录时清除会话。这样,无论他们是否已注销,您都可以重新开始:

    @RequestMapping("login")
    public String login(LoginForm form, HttpServletRequest request, HttpSession session) {
    
        session.invalidate();
        HttpSession newSession = request.getSession(); // create session
    
        // log the user in
    
        return "successPage";
    }    
    

    【讨论】:

      【解决方案2】:

      史蒂夫的回答很好。只是为了添加更多上下文,您应该始终在用户身份验证事件之后使新会话无效并创建一个新会话,作为对抗会话固定攻击的最佳实践。

      完成您想要做的事情的另一种方法是使用 Spring Security。我不确定您是否考虑过它,但默认情况下,它会在每个用户登录时为您处理无效和生成新会话。此外,它还具有您可能会或可能不会觉得有用的其他功能。此链接可能会有所帮助:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ns-config.html。滚动到“3.3.3/会话固定攻击保护”部分以获取与您的问题相关的信息

      【讨论】:

      • 你说得对,看起来 spring security 正是我想要的。谢谢!
      【解决方案3】:

      注销后创建新会话检查session.isNew()条件如果会话旧然后调用invalidate()。将注销方法重定向到 /login 映射。它会检查会话,它会在您调用invalidate() 方法时创建新会话。

      退出代码:

      @RequestMapping("/logout")
      public String logout() {
          return "redirect:/login";
      }
      

      登录代码:

      @RequestMapping(value = "/login")
      public String login(HttpServletRequest request, HttpSession session) {
          /*
           * create new session if session is not new
           */
          if (!session.isNew()) {
              session.invalidate();
          }
          return "login";
      }
      

      【讨论】:

        猜你喜欢
        • 2014-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多