我有一个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两次!
在我看来,你不应该为此目的使用会话。也许您可以添加一个参数来请求(即事务ID)并通过所有相关请求传递它,因此当用户关闭页面时,事务ID将会消失。然后,您可以在http会话或其他地方存储与给定事务ID关联的任何数据,也可以在一段时间后清除它。
spring框架有一个名为bean scope的抽象,它看起来非常适合您的场景,因此您可以为事务(或用户的会话)创建自定义作用域,并将所有数据存储在使用此类自定义作用域的某些bean中。
您应该在会话中存储一些信息(属性)。如果是的话,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( ) );