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地址、名称和/或一些随机生成的令牌存储在数据库的某个表中
- 当用户注销时,从表中清除以前存储的值
- 在登录过程中,检查该表以查看该表中是否已有用户信息,如果信息可用,则表示用户已从其他计算机、浏览器等登录,并拒绝登录访问
- 如果信息不可用,则允许用户登录
因此,用户可以毫无问题地再次登录。您可以在users表中选择一个列名称为“IsLoggedIn”的额外字段作为位字段,并将其设置为true,直到用户注销。一旦用户注销,将其设置为false。对于会话到期时间也需要这样做。一旦会话到期,应使用触发器或通过SP调用自动将此字段设置为false。
当尝试从不同的浏览器或计算机登录时,它应该检查“IsLoggedIn”字段是否为真,如果不是真的,则让用户登录。我们所从事的项目也有类似的情况,我们采取的方法是:
尝试在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