如何在关闭浏览器时从数据库中删除数据

时间:2012-09-01 20:56:36

标签: java sql jsp session servlets

当用户登录我的网络应用时,我会创建一个会话:

session.setAttribute("SessionNumber","100");

他的用户名被添加到名为ONLINE_USERS.的表中 其他在线用户将能够看到他,他们看到所有在线用户

当用户点击退出按钮时,我从表中删除该行,然后使用以下命令删除会话:

session.invalidate();

但是让我们说用户已经存在浏览器,他的会话将会消失,但该行将作为在线用户留在数据库中,如何避免这种情况?

我在Netbeans上使用JSP-Servlets。

3 个答案:

答案 0 :(得分:6)

您可以启用自定义HttpSessionListener以在会话失效时删除表格行。

public class YourHttpSessionListener implements HttpSessionListener {       
   public void sessionCreated(HttpSessionEvent event) {
   //put row in the database
   }

   public void sessionDestroyed(HttpSessionEvent event) {
     //delete the row from database     
   }
}

在web.xml中声明侦听器:

<listener>
    <listener-class>YourHttpSessionListener</listener-class>
</listener>

请注意,在用户退出浏览器并且其会话在服务器上过期之间会有延迟。但会话到期时间是可配置的。您应该找到合适的到期超时:不要太长,这样您就不会在线显示过多的离线用户,但也不能太短以至于不能让连接的用户处于空闲状态。

对于使用基本servletjsp技术开发的聊天应用程序,我认为这是一个很好的权衡。

答案 1 :(得分:1)

据我了解,您希望看到目前正在网站上运行的用户,HttpSessionListener的问题是会话在销毁之前可以存活很长时间,因此可能会发生用户长时间不使用网站的情况它被摧毁了。 (见http://www.smartsoftwarebits.com/qaa/46-misc/82-how-to-set-session-timeout-for-tomcat

解决方案:您可以在数据库中添加一列,您可以在其中存储上次请求的时间戳 用户制作的。要使此列保持最新,请使用servlet过滤器。 (http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html

要清除在线用户添加计时器作业(例如使用石英),您将删除早于(例如)5分钟的行(在线用户)(因此当最后一次交互超过5分钟时)。({ {3}})

使用此功能,您现在可以非常精确地确定用户是否“仍在那里”。

此外,您可以向客户端javascript添加计时器以定期进行ajax调用。您可以通过这种方式处理用户未关闭浏览器暂时处于非活动状态一段时间的情况。

答案 2 :(得分:1)

首先是在浏览器关闭时捕获事件

您可以在jsp中尝试下面的代码片段来点击js函数,该函数将调用ajax函数来命中服务器端组件。然后只需使用会话API使会话无效,并添加代码以从表中删除记录。

window.onbeforeunload = WindowClose; 

function WindowClose() { 

  //Write a AJAx request here to hit the server side servlet  to invalidate the session

}

或使用

<body onunload="WindowClose(); >

在服务器端代码中,使用

HttpSession session = request.getsession(); session.setMaxInactiveInterval(0); //或session.invalidate();

在web.xml中定义默认会话超时值是一种很好的方法,以便浏览器崩溃,会话将在规定的时间过后失效。

<session-config>
<session-timeout>30</session-timeout>
</session-config>