防止使用相同的用户名和密码多次登录

2022-09-02 23:47:21

我正在开发一个应用程序,该应用程序需要防止使用相同的用户名和密码进行多次登录。

如果它发生在同一台计算机上,那么显然我们需要对用户会话执行一些操作,但是如果它们使用相同的用户名和密码在不同的计算机上登录,它也应该阻止它们。

我们必须牢记以下几点:

  1. 如果用户在不注销的情况下关闭浏览器。
  2. 如果会话超时。

我将不胜感激对此的任何帮助。


答案 1

如果用户在不注销的情况下关闭浏览器。

特别是这种情况很难检测,也不可靠。你可以在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


答案 2

在数据库中创建一个表(我们称之为表),其中包含三个字段:[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设置为 MULTIPLELOGINusernamelogout_time

如果该用户已登录到任何其他计算机,则如果他刷新或导航到另一个页面,则站点将告诉他他已注销。然后,用户可以被重定向到该网站的主页。


推荐