在窗口关闭时销毁存储在数据库中的用户会话

时间:2014-12-23 12:13:09

标签: java database session web-applications

在我们的JAVA网络应用程序中,我们维护用户'数据库表active_sessions中的会话。我们不允许每个用户使用多个会话。这意味着,如果您已经使用特定用户帐户登录,则无法使用同一帐户打开新会话。如果有人这样做,我们会显示错误'用户已经有一个活动会话'。当用户点击Logout时,表格active_sessions中的条目将被删除。但是如果用户关闭窗口而未注销其条目,则保留在表active_sessions中。因此,任何未来登录的尝试都会导致错误“用户已经有一个活动的会话”。有关如何在不注销的情况下关闭浏览器窗口的情况下如何销毁数据库中的用户会话的任何提示。

编辑:阅读完所有帖子后,似乎没有干净的方法来限制每个用户的单个会话。

3 个答案:

答案 0 :(得分:2)

使用“onbeforeonload”JavaScript事件可以对您的服务器执行AJAX调用以删除该条目。然而,每次卸载页面时都会执行此事件,因此如果您没有SPA,则需要忽略href等事件。

同意Almas,但是你的方法很危险,因为不可能强制执行这100%。例如。如果用户杀死浏览器进程,那么即使这个JS事件也不会被发布。 此外,用户只需使用其他浏览器即可绕过“保护”。

答案 1 :(得分:1)

在服务器端,用户HTTP会话通常在一段空闲时间后无效。您可以实现http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionListener.html并在web.xml中注册它以接收有关会话创建/销毁等的通知。在您的侦听器实现中,您可以删除会话销毁事件上的表条目。

答案 2 :(得分:0)

HTTP的基本内容是它是请求/响应协议。 即,仅通过向服务器发出请求来更改/访问事物。这种“限制”使您的要求变得有趣。可以有两种解决方法: -

  1. 通过AJAX调用以重复间隔轮询服务器。只要您的应用程序不断获取轮询AJAX请求,您就可以认为该窗口已打开。

  2. 使用javascript(window.onunload)触发事件以在浏览器关闭时销毁用户会话。

  3. Using onuload