我目前在Google App Engine上部署了一个简单的JSP Servlet Web应用程序。 我有一个SessionListener实现HttpSessionListener来监视会话的创建和销毁。
public class SessionListener implements HttpSessionListener {
private int sessionCount = 0;
@Override
public void sessionCreated(HttpSessionEvent event) {
// TODO Auto-generated method stub
synchronized (this) {
sessionCount++;
}
System.out.println("Session Created: " + event.getSession().getId());
System.out.println("Total Sessions: " + sessionCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
// TODO Auto-generated method stub
synchronized (this) {
sessionCount--;
}
System.out.println("Session Destroyed: " + event.getSession().getId() + ", " + event.getSession().getAttribute("loginName"));
System.out.println("Total Sessions: " + sessionCount);
}
}
在web.xml文件中,我设置了以下配置以允许30分钟后自动会话超时:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
在appengine-web.xml文件中,我设置了以下配置:
<sessions-enabled>true</sessions-enabled>
当部署并在本地运行时,空闲30分钟会在30分钟后被破坏,正如我在控制台中看到的那样
"Session Destroyed: {sessionId} etc"
然而,当我在GAE上部署应用程序时,我无法在GAE管理页面的日志控制台中找到空闲会话的打印输出。当我明确点击调用
的Logout按钮时,会话才会被销毁HttpSession session=request.getSession(false);
session.invalidate();
所以我认为空闲会话在特定的设定时间后永远不会被破坏。我注意到随着新浏览器访问网络应用程序,会话总数不断增加。
我知道GAE按照自己的方式处理会话:在数据存储区中存储会话并在整个JVM中共享它们。但是有没有办法使会话超时工作并在一段时间内将会话空闲?
答案 0 :(得分:3)
调整GAE内置的SessionCleanupServlet为我解决了这个问题。更多详情:http://www.radomirml.com/blog/2011/03/26/cleaning-up-expired-sessions-from-app-engine-datastore/