我正在尝试停止多次登录我的应用程序,我正在使用这种方法:
首次用户登录我在会话中保存了用户,第二次用户尝试再次登录时,我首先检查会话,如果会话中已经有相同的用户,我不允许用户登录再次。
这种方法在相同的浏览器中运行良好但是如果我尝试使用相同的用户再次登录来自另一个浏览器,它允许多次登录,因为会话中没有任何内容。
如果我尝试从其他计算机登录,也会出现同样的问题。
请建议。 谢谢
这是我的
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
}
答案 0 :(得分:2)
以下是您可以尝试实现的步骤:
但当然这不是一个傻瓜证明,根据您的需要,您可能需要添加adiitional列等。
此方法还有一些缺点需要处理,其中一个案例是:
1)如果用户的PC关机或者用户无需注销,会发生什么?在这种情况下,用户将被拒绝访问。
在这种情况下,应该在特定的时间间隔运行一些工作来进行清理过程。您可能需要在查找表中添加“Timestamp”列,该作业的主要工作是将时间戳与某些预定义的超时值(比如10分钟)进行比较并删除所有这些行。
所以再次用户可以毫无问题地登录。
答案 1 :(得分:0)
当用户通过Web浏览器登录时,您可以像正常一样进行会话,然后在数据库上声明他们已登录。当他们尝试再次登录时,您会检查数据库以查找用户以及是否已记录不允许他们在新页面上。
当他们注销时你会破坏会话但是你还需要设置数据库说他们没有登录。这将阻止人们从不同的浏览器登录
答案 2 :(得分:0)
您可以在用户表中使用列名“IsLoggedIn”作为位字段的一个额外字段,并将其设置为true,直到用户注销。用户注销后立即将其设置为false。这也需要在会话到期时间内完成。会话到期后,应使用触发器或SP调用自动将此字段设置为false。 在尝试从不同的浏览器或计算机登录时,如果已经存在,则应检查“IsLoggedIn”字段,如果不是,请让用户登录。
答案 3 :(得分:0)
我们在项目中遇到类似的情况,我们采取的方法是:
答案 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来管理列表。会话结束时,检查是否已登录并从列表中删除登录名。