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

Posted

技术标签:

【中文标题】如何在关闭浏览器时从数据库中删除数据【英文标题】:How to Delete data from Database upon closing the browser 【发布时间】:2012-08-27 05:10:42 【问题描述】:

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

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

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

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

session.invalidate();

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

我在 Netbeans 上使用 JSP-Servlet。

【问题讨论】:

【参考方案1】:

您可以启用自定义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 技术开发的聊天应用程序来说,这是一个很好的折衷方案。

【讨论】:

不是即时也可以,但延迟可以超过5分钟?我应该在哪里写这些代码?我有 index.jsp、chat.jsp,这是用户花时间聊天的地方。 延迟可能与您在 web.xml 中配置的会话过期超时时间一样长(默认为 30 分钟)。 HttpSessionListener 是一个独立的 java 类,独立于任何 jsp 文件。【参考方案2】:

据我了解,您希望看到目前正在网站上操作的用户,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 分钟时)(@ 987654323@)

使用这个你现在可以非常准确地判断是否有用户“仍然存在”。

此外,您可以向客户端 javascript 添加一个计时器,以定期进行 ajax 调用。当用户没有关闭浏览器只是暂时处于非活动状态时,您可以通过这种方式处理。

【讨论】:

这样您将清除有效会话:未关闭浏览器但处于非活动状态超过 5 分钟的用户。 是的,用 ajax 调用更新了答案 :) 但也是有问题的,并且取决于实际的网站,如果我们想将非活动用户处理为“在线”或不处理【参考方案3】:

首先要在浏览器关闭时捕捉事件

您可以尝试在您的 jsp 中使用下面的代码 sn-p 来访问一个 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 会话 = request.getsession(); session.setMaxInactiveInterval(0); //或 session.invalidate();

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

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

【讨论】:

以上是关于如何在关闭浏览器时从数据库中删除数据的主要内容,如果未能解决你的问题,请参考以下文章

如果用户关闭浏览器,则从数据库中删除数据[重复]

如果用户忘记注销并关闭浏览器,如何删除 Rails 中以前的会话?

PHP如何实现关闭浏览器的情况下关闭session

如何在 c# 中关闭任何浏览器时从 XMPP 注销?

在nodejs中删除浏览器关闭时的会话

关闭浏览器时如何删除用于注销的 codeigniter 会话?