防止使用相同的用户名和密码多次登录
我正在开发一个应用程序,该应用程序需要防止使用相同的用户名和密码进行多次登录。
如果它发生在同一台计算机上,那么显然我们需要对用户会话执行一些操作,但是如果它们使用相同的用户名和密码在不同的计算机上登录,它也应该阻止它们。
我们必须牢记以下几点:
- 如果用户在不注销的情况下关闭浏览器。
- 如果会话超时。
我将不胜感激对此的任何帮助。
我正在开发一个应用程序,该应用程序需要防止使用相同的用户名和密码进行多次登录。
如果它发生在同一台计算机上,那么显然我们需要对用户会话执行一些操作,但是如果它们使用相同的用户名和密码在不同的计算机上登录,它也应该阻止它们。
我们必须牢记以下几点:
我将不胜感激对此的任何帮助。
如果用户在不注销的情况下关闭浏览器。
特别是这种情况很难检测,也不可靠。你可以在Javascript中使用这个事件,但你完全取决于浏览器是否启用了JS,以及特定的浏览器是否支持这个非标准事件(例如,Opera不支持)。这也是我建议注销以前登录的用户而不是阻止登录的主要原因之一。对于用户“忘记”从另一台计算机注销的情况,这也更加用户友好和安全。beforeunload
最简单的方法是让有一个变量,让它实现HttpSessionBindingListener(和Object#equals()和Object#hashCode())。Userstatic Map<User, HttpSession>
public class User implements HttpSessionBindingListener {
// All logins.
private static Map<User, HttpSession> logins = new HashMap<User, HttpSession>();
// Normal properties.
private Long id;
private String username;
// Etc.. Of course with public getters+setters.
@Override
public boolean equals(Object other) {
return (other instanceof User) && (id != null) ? id.equals(((User) other).id) : (other == this);
}
@Override
public int hashCode() {
return (id != null) ? (this.getClass().hashCode() + id.hashCode()) : super.hashCode();
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = logins.remove(this);
if (session != null) {
session.invalidate();
}
logins.put(this, event.getSession());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
logins.remove(this);
}
}
当您登录时,如下所示:User
User user = userDAO.find(username, password);
if (user != null) {
request.getSession.setAttribute("user", user);
} else {
// Show error.
}
然后它将调用,这将从地图中删除任何先前登录的用户并使会话无效。valueBound()logins
当您注销时,如下所示:User
request.getSession().removeAttribute("user");
或者当会话超时时,将调用 ,这将从映射中删除用户。valueUnbound()logins
在数据库中创建一个表(我们称之为表),其中包含三个字段:[online_users]
[online_users]
1. username
2. login_time
3. logout_time
每当用户登录时,将用户名和登录时间插入到 中。[online_users]
在要求用户登录的所有页面上,放置以下条件:检查用户的是否为空。[online_users]logout_time
每当用户按下注销按钮时,请为该用户名设置 in。logout_time[online_users]
如果有人尝试使用有效的用户名和密码登录,请检查并显示一条消息,指出该用户已登录。最重要的是,将该用户的logout_time设置为 MULTIPLELOGIN。usernamelogout_time
如果该用户已登录到任何其他计算机,则如果他刷新或导航到另一个页面,则站点将告诉他他已注销。然后,用户可以被重定向到该网站的主页。