每次用户连接到Servlet时,请确保新会话

时间:2010-05-20 18:54:12

标签: java session servlets

我有一个JSP / Servlet Web App,它包含多个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两次!

2 个答案:

答案 0 :(得分:3)

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

spring框架有一个名为bean scope的抽象,它看起来非常适合你的场景,所以你可以为你的事务(或用户的会话)创建一个自定义作用域,并将所有数据存储在一些作用于这种自定义的bean中范围。

答案 1 :(得分:1)

您应该在会话中存储一些信息(属性)。如果是,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( ) );