Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不允许用户多次登录_Java - Fatal编程技术网

Java 不允许用户多次登录

Java 不允许用户多次登录,java,Java,我正在尝试停止多次登录我的应用程序,为此我使用以下方法: 第一次用户登录时,我将用户保存在会话中,第二次用户尝试再次登录时,我首先检查会话,如果会话中已经有相同的用户,我不允许用户再次登录 这种方法在同一个浏览器中运行良好,但如果我尝试从另一个浏览器使用同一用户再次登录,它允许多次登录,因为会话中没有任何内容 如果我尝试从其他计算机登录,同样的问题也会发生 请建议。 谢谢 这是我的 User user = (User) rdbHelper.getAuthentication

我正在尝试停止多次登录我的应用程序,为此我使用以下方法:

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

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

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

请建议。 谢谢

这是我的

           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
        }

当用户通过web浏览器登录时,您将会话设置为正常,然后在数据库上声明他们已登录。当他们再次尝试登录时,您会检查用户的数据库,如果他们已登录,则不允许他们进入新页面


当他们注销时,您将破坏会话,但您还需要设置数据库,以表明他们未登录。这将阻止人们从不同浏览器登录

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

  • 用户登录后,立即将其IP地址、名称和/或一些随机生成的令牌存储在数据库的某个表中
  • 当用户注销时,从表中清除以前存储的值
  • 在登录过程中,检查该表以查看该表中是否已有用户信息,如果信息可用,则表示用户已从其他计算机、浏览器等登录,并拒绝登录访问
  • 如果信息不可用,则允许用户登录
当然,这并不是傻瓜式的,根据您的需要,您可能需要添加传统列等

这种方法也有一些缺点需要处理,其中一种情况是:

1) 如果用户的电脑关机或用户不想注销,会发生什么情况?在这种情况下,用户将无法访问

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


因此,用户可以毫无问题地再次登录。

您可以在users表中选择一个列名称为“IsLoggedIn”的额外字段作为位字段,并将其设置为true,直到用户注销。一旦用户注销,将其设置为false。对于会话到期时间也需要这样做。一旦会话到期,应使用触发器或通过SP调用自动将此字段设置为false。
当尝试从不同的浏览器或计算机登录时,它应该检查“IsLoggedIn”字段是否为真,如果不是真的,则让用户登录。

我们所从事的项目也有类似的情况,我们采取的方法是:

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

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

    context = getServletContext();
    List<string> logins = context.getAttribute("logins");
    logins.add(username);
    
    context=getServletContext();
    列表登录名=context.getAttribute(“登录名”);
    添加(用户名);
    
    检查登录名可以像这样工作

    context = getServletContext();
    List<string> logins = context.getAttribute("logins");
    if (!logins.contains(username)) {
       login();
    } else {
       deny();
    }
    
    context=getServletContext();
    列表登录名=context.getAttribute(“登录名”);
    如果(!logins.contains(用户名)){
    登录();
    }否则{
    否定();
    }
    
    使用servletContextListener在应用程序启动时创建列表


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

    这不可能只用一个会话就完成,但您需要在数据库中存储IP地址,并在此基础上检查谢谢,但如果用户计算机意外关闭,用户没有自己登录,我认为使用这种方法,他将永远无法登录again@junaidp,我已编辑:)在这种情况下,应该在特定的时间间隔运行一些作业来清理表,就像会话超时一样。谢谢:)。这种方法很好,但你的意思是,每10分钟就会有一个呼叫db。即使用户pc工作正常,他正在处理我的应用程序。。在这种情况下,以指定的时间间隔运行的作业将在10分钟后进入数据库,并删除所有内容,即使用户正在顺利使用应用程序(没有PC挂断或任何事情)。。但是db表现在已清除,所以。。。然后,其他用户可以登录。。我说的对吗?@junaidp,此作业将运行与应用程序不同的进程。此外,您还需要有另一个标志,以了解用户是否仍在应用程序上运行。:)正确,谢谢,嗯,如果你能告诉我们如何检查用户是否仍在应用程序上运行..谢谢,但是如果用户计算机只是意外关闭,或者用户自己没有注销就关闭了浏览器,那么使用这种方法,我想他将永远无法再次登录您添加一个会话变量以等待时间。我就是这样做的。如果他们在访问页面时设置了时间变量,则检查时间和comp