【问题标题】:Ensure a new session every time the user connects to a Servlet确保每次用户连接到 Servlet 时都有一个新会话
【发布时间】:2011-02-22 01:03:03
【问题描述】:

我有一个 JSP/Servlet Web 应用程序,它包含多个 servlet(和一些 JSP)

每当用户访问 servlet A 时,我都需要创建一个新的 HttpSession,因为知道 servlet A 是主页(即,他将其作为应用程序中的第一个 servlet/页面访问)。

到目前为止一切顺利,我可以在 servlet A 的开头编写以下代码:

HttpSession session = request.getSession(false);
if (session == null) {  
    logger.debug("starting new session...");
    session = request.getSession();
    // other stuff here
}

但问题是,如果用户没有关闭他的浏览器(即使他关闭了选项卡 - 例如在 Firefox 中 - 会话仍将打开),所以当他尝试再次打开我的网站时,最后会话将被重新使用(当然在会话超时的范围内),我不需要这个。我需要每当他访问 Servlet A 时,他都会获得一个全新的 HttpSession。

但不幸的是,根据某些场景,他可能会在每个会话中访问此 servlet 两次!

【问题讨论】:

    标签: java session servlets


    【解决方案1】:

    在我看来,您不应该为此目的使用会话。也许您可以向请求添加一个参数(即事务 ID)并通过所有相关请求传递它,因此当用户关闭页面时,事务 ID 将消失。然后,您可以将与给定事务 id 关联的任何数据存储在 http 会话或其他地方,也可以在一段时间后清理它。

    spring 框架有一个称为 bean 范围的抽象,它看起来很适合您的场景,因此您可以为您的事务(或用户的会话)创建一个自定义范围,并将所有数据存储在具有此类自定义范围的某个 bean 中范围。

    【讨论】:

      【解决方案2】:

      您应该将一些信息(属性)存储在已使用的会话中。如果是的话,invalidate

      HttpSession session = request.getSession();
      
      Object isOld = session.getAttribute( "isOld" );
      
      if ( isOld != null )
      {
        session.invalidate( );
      
        // Recreate session
        session = request.getSession( );
      }
      
      session.setAttribute( "isOld", new Object( ) );
      

      【讨论】:

        猜你喜欢
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多