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

问题描述 投票:2回答:2

我有一个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两次!

java session servlets
2个回答
3
投票

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

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


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( ) );
© www.soinside.com 2019 - 2024. All rights reserved.