如何在关闭浏览器时从数据库中删除数据
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>
请注意,从用户退出浏览器到他的会话在服务器上过期之间会有一段延迟。但是会话到期时间是可配置的。您应该找到一个合适的过期超时时间:不要太长,这样您就不会将太多离线用户显示为在线,但也不要太短,以免连接用户有空闲时间。
我认为对于使用基本 servlet
和 jsp
技术开发的聊天应用程序来说,这是一个很好的折衷方案。
【讨论】:
不是即时也可以,但延迟可以超过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>
【讨论】:
以上是关于如何在关闭浏览器时从数据库中删除数据的主要内容,如果未能解决你的问题,请参考以下文章