不允许用户多次登录

时间:2013-10-20 08:05:10

标签: java

我正在尝试停止多次登录我的应用程序,我正在使用这种方法:

首次用户登录我在会话中保存了用户,第二次用户尝试再次登录时,我首先检查会话,如果会话中已经有相同的用户,我不允许用户登录再次。

这种方法在相同的浏览器中运行良好但是如果我尝试使用相同的用户再次登录来自另一个浏览器,它允许多次登录,因为会话中没有任何内容。

如果我尝试从其他计算机登录,也会出现同样的问题。

请建议。 谢谢

这是我的

           User user = (User) rdbHelper.getAuthentication(userid, password);
    if(user!=null)
    {
        session=getThreadLocalRequest().getSession(true);
        User loggedInUser = (User) session.getAttribute("user");

        if(user.getId() == loggedInUser.getId()){
        user.setId(0); // making user null and stopping user to login
        }else{
        session=getThreadLocalRequest().getSession(true);
        session.setAttribute("user", user); // allow user to sing in
        }

5 个答案:

答案 0 :(得分:2)

以下是您可以尝试实现的步骤:

  • 用户登录后立即将他的IP地址,他的名字和/或一些随机生成的令牌存储在数据库的某个表中。
  • 当用户注销时,清除表中先前存储的值。
  • 在登录过程中,检查该表以查看表中是否已存在用户信息,如果信息可用,则表示用户已从其他计算机,浏览器等登录并拒绝登录访问。
  • 如果信息不可用,则允许用户登录。

但当然这不是一个傻瓜证明,根据您的需要,您可能需要添加adiitional列等。

此方法还有一些缺点需要处理,其中一个案例是:

1)如果用户的PC关机或者用户无需注销,会发生什么?在这种情况下,用户将被拒绝访问。

在这种情况下,应该在特定的时间间隔运行一些工作来进行清理过程。您可能需要在查找表中添加“Timestamp”列,该作业的主要工作是将时间戳与某些预定义的超时值(比如10分钟)进行比较并删除所有这些行。

所以再次用户可以毫无问题地登录。

答案 1 :(得分:0)

当用户通过Web浏览器登录时,您可以像正常一样进行会话,然后在数据库上声明他们已登录。当他们尝试再次登录时,您会检查数据库以查找用户以及是否已记录不允许他们在新页面上。

当他们注销时你会破坏会话但是你还需要设置数据库说他们没有登录。这将阻止人们从不同的浏览器登录

答案 2 :(得分:0)

您可以在用户表中使用列名“IsLoggedIn”作为位字段的一个额外字段,并将其设置为true,直到用户注销。用户注销后立即将其设置为false。这也需要在会话到期时间内完成。会话到期后,应使用触发器或SP调用自动将此字段设置为false。 在尝试从不同的浏览器或计算机登录时,如果已经存在,则应检查“IsLoggedIn”字段,如果不是,请让用户登录。

答案 3 :(得分:0)

我们在项目中遇到类似的情况,我们采取的方法是:

  1. 每当用户登录并在该用户的会话和数据库中存储令牌时生成令牌。
  2. 每次向服务器发出请求时,请验证令牌,以确保他处于有效会话中,并且在超时后他没有回来。 (任何时间间隔超过15分钟并且我们使令牌无效的请求)
  3. 如果用户尝试再次登录(例如从其他浏览器登录或未注销),我们可以看到该用户的数据库中仍然存在该令牌,如果他愿意,我们会向用户显示警告消息“杀死”旧会议。这样,即使计算机崩溃或忘记注销,他也可以决定终止旧会话并继续新会话。或者他可以取消创建新令牌以继续使用旧会话。
  4. 当然,如果用户点击“退出”,我们会清除令牌

答案 4 :(得分:0)

尝试在servlet上下文中存储数据。用户登录时

context = getServletContext();
List<string> logins = context.getAttribute("logins");
logins.add(username);

登录检查可能会像这样。

context = getServletContext();
List<string> logins = context.getAttribute("logins");
if (!logins.contains(username)) {
   login();
} else {
   deny();
}

使用servletContextListener在应用程序启动时创建列表。

我会使用HttpSessionListener来管理列表。会话结束时,检查是否已登录并从列表中删除登录名。