如何在因特网断开连接或用户关闭标签/浏览器时调用logout servlet?

时间:2012-09-12 05:57:31

标签: java javascript jsp servlets

我想避免使用相同的用户名和密码进行并发登录,因为我在数据库中设置了isloggedin选项,如果用户登录它将变为“1”,那么使用该用户名和密码他无法再次登录,如果他呼叫退出,它将变为'0',以便他可以登录。一切都很好,但在网络断开或用户关闭标签时有问题。他不能登录,因为isloggedin设置为'1',应该通过设置为一个来避免它,这意味着它应该调用logout servlet。我可以实现这个吗?

5 个答案:

答案 0 :(得分:3)

当用户关闭标签页或浏览器时,没有技术可以确定地通知Web服务器。 以下技术可以帮助您在用户会话结束后终止。

  1. 在web.xml中配置session-timeout。
  2. 设置cookie的年龄(如果您使用的是)等于-1。那么当浏览器关闭时它会被删除。
  3. 您可能有一个java脚本定期向服务器发送一些数据(心跳),表明会话处于活动状态。 (但即使用户长时间闲置,这也会使会话保持活动状态)

答案 1 :(得分:2)

您应该使用spring-security来验证用户身份。除了其他好处之外,您还可以控制允许的并发登录次数,请参阅:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html中的“并发会话控制” 这样一旦用户使会话无效(通过使用注销操作)或关闭浏览器页面(你甚至可以捕获它,请参阅onbeforeunload事件),即使会话因为空闲太多而超时也会超时框架将为您处理所有情况。这样您就不再需要维护该db值了。

答案 2 :(得分:1)

最好不要使用DB标志,而是将服务器中的List用作全局参数,并将用户名添加到此。因此,每当用户尝试登录时,都会将参数添加到List中。然后,如果用户再次尝试登录会话,请在列表中检查该用户名是否可用,如果可用则从该会话中删除。

如果使用DB,可能会导致数据库过载。保持DB免费

答案 3 :(得分:0)

你只需要在浏览器关闭时调用javascrip函数。你可以在那里添加逻辑来改变会话或限制用户关闭窗口。全取决于你。 这里有一些参考代码可以指导你

<html><head><title>Example</title>
<script language = "JavaScript">
function abc()
{
statements...
}
</script></head>
<body ONUNLOAD = "abc()">
</html>

答案 4 :(得分:0)

没有一致或100%可靠的方法来检测断开/关闭浏览器,它在HTTP协议中根本没有解决。如前所述,您可以使用Javascript(body onunload)获得一些信息,但这并未涉及所有方案,并且在浏览器中不一致。

这里简短的回答是,您不应该将系统设计为依赖于能够检测到用户离开您的站点的时刻(断开/导航/关闭窗口),因为您不能。