1

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

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

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

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

请建议。谢谢

这是我所拥有的

           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
        }
4

5 回答 5

2

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

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

但当然这不是万无一失的证明,根据您的需要,您可能需要添加附加列等。

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

1) 如果用户的 PC 关闭或用户懒得注销会怎样?在这种情况下,用户将被拒绝访问。

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

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

于 2013-10-20T08:13:25.050 回答
0

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

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

于 2013-10-20T08:13:01.893 回答
0

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

于 2013-10-20T08:25:52.643 回答
0

我们在做的项目中也有类似的情况,我们采取的方法是:

  1. 每当用户登录时生成一个令牌并将其存储在该用户的会话和数据库中。
  2. 在对服务器的每个请求时,验证令牌,以确保他处于有效会话中并且他在超时后没有回来。(任何时间间隔超过 15 分钟的请求,我们都会使令牌无效)
  3. 如果用户尝试再次登录(例如从不同的浏览器或没有注销),我们可以看到该用户的令牌仍然存在于数据库中,如果他想“杀死”,我们会向用户显示警告消息旧会议。这样,即使计算机崩溃或忘记注销,他也可以决定终止旧会话并继续新会话。或者他可以取消新令牌的创建以继续处理旧会话。
  4. 当然,如果用户点击“注销”,我们清除token
于 2013-10-20T08:43:08.587 回答
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 来管理列表。当会话结束时,检查它是否已登录并从列表中删除登录名。

于 2013-10-20T08:46:09.270 回答