2013-05-20 83 views
2

我有一个要求,即如果用户从一个浏览器登录,那么她不能从任何其他地方登录。一次只有一个用户登录

我所做的是当用户登录在我进入她的状态在日志表的登录,当她登出我更新状态。

问题出现:如果她没有注销并关闭浏览器会怎么样?

任何帮助或改善将提前:-)我使用笨作为后端工具可以理解的。

+3

在每个页面请求上更新的数据库中实现“last seen at”字段。如果用户在X分钟内没有看到该用户,则认为该用户已注销。 –

+0

@Jonathon Reinhart你的意思是在每个页面请求我必须检查“最后看到”字段的数据库?我将保存在这个领域?IP地址? – user2013626

+0

这将是一个时间戳。 –

回答

1

在服务器端做到这一点是最好的选择。您可以保留您的应用程序上下文中的登录用户。

嗯,有点提示。使用一个Servlet过滤器,例如AuthFilter,并进行验证,可能是isAlreadyLoggedIn(),在那里旁边其他验证,如用户名/密码等。现在有了这个检查后,你要么 - 它取决于你想要什么与用户试图登录到做到,显示“用户已经登录”的消息,

+0

问题出现在他刚刚关闭浏览器时,我怎么才能知道他已经注销? – user2013626

+0

当时你需要使用session-timeout作为用户登录,并且确保你可以给会话超时一点小小的价值 – Gautam3164

+0

会话被浏览器破坏了吗?我无法跟踪会话超时吗? – user2013626

0

正如其他人所说,使用在服务器/数据库端超时是你最好的选择。

你问的方式来检测,如果用户关闭浏览器 - 有JavaScript的onunload事件其中,在大多数时候,如果用户关闭了浏览器窗口,将闪光。但是,它不会因紧急停车而关闭,或者如果javascript已关闭,所以它不是非常可靠。

还有其他一些原因,为什么在服务器端实现超时是推荐的方法。例如,用户可能刚从公共计算机登录并忘记注销。在这种情况下,即使浏览器窗口仍处于打开状态,您确实希望在某个时间点超时。

此外,有某种超时会减少会话修复攻击的变化。