如何在java中防止在不同设备上使用相同凭据多次登录

如何在java中防止在不同设备上使用相同凭据多次登录,java,session,servlets,Java,Session,Servlets,我有一个要求:我需要防止在不同设备上使用相同凭据多次登录,即注销以前的登录用户并允许新用户登录 假设user\u A已经登录,那么user\u B尝试使用与user\u A相同的凭据登录应用程序,然后注销user\u A并允许user\u B登录。我使用servlet和会话尝试了这一操作,但无法解决 提前感谢。您需要使用会话属性并检查属性是否为空。如果属性不是空的,请使用新的用户对象替换它 User currentUser=(User)request.getSession().getAttrib

我有一个要求:我需要防止在不同设备上使用相同凭据多次登录,即注销以前的登录用户并允许新用户登录

假设
user\u A
已经登录,那么
user\u B
尝试使用与
user\u A
相同的凭据登录应用程序,然后注销
user\u A
并允许
user\u B
登录。我使用
servlet
会话
尝试了这一操作,但无法解决


提前感谢。

您需要使用会话属性并检查属性是否为空。如果属性不是空的,请使用新的用户对象替换它

User currentUser=(User)request.getSession().getAttribute("loggedUser");

if(currentUser!=null)
request.getSession().setAttribute("loggedUser",currentUser);

else
request.getSession(true).setAttribute("loggedUser",currentUser);

你需要有一个应用范围的概念

当用户登录时,只需在该应用程序范围上下文中将其注册为已登录(例如,如果您使用的是jsf/cdi,则将其存储在
@ApplicationScoped
@Singleton
bean中)

本例假设您正在定义自己的上下文

//Application scoped.
//You need also more or less make it singleton
public enum MyApplication{
  CURRENT_APPLICATION;

  public void onLogin(MyUser user, HttpSession session){}
  public MyUser getCurrentUser(HttpSession session) {}
  public boolean isLoggedIn(MyUser user){} //logged in on any session
  public boolean isLoggedIn(MyUser user, HttpSession session){} //logged in on this session
  public void logoutUser(MyUser user){} //logs out the user in any session
}

public class MyServlet extends HttpServlet{
  //somewher in do get or post
  private void login(String username, String password) {
    MyUser user = findUser(username, password);
    boolean loggedInAnotherSession = MyApplication.CURRENT_APPLICATION.isLoggedInUser(user);
    //logout the user from the other session or something like that
    boolean loggedInOnThisSession = MyApplication.CURRENT_APPLICATION.isLoggedInUser(user, getSession()); //session from http request
    //logout the user if the he is loggedin in a different session other than this
    if(!loggedInAnotherSession || !loggedInOnThisSession){
      //user is either logged in a different session or not logged in at all.
      //login the user
      MyApplication.CURRENT_APPLICATION.onLogin(user, getSession());
    }
  }
}

不是用Java,可能过于简化了,但是嘿。。。它在Web2Py中对我有效:

只有在成功登录后,我才在MySQL数据库的auth_成员表中写入SessionID(response.session_id)。 在登录页(索引页)上,我检查当前response.session_id是否等于来自数据库的SessionID。 如果是的话,一切都很好。 如果不是-(首先是“较老的”)用户礼貌地注销

由于每次登录都会创建一个新的response.session_id并将其存储在数据库中,因此上述方法是有效的。 检查只在登录页面上进行(在我的应用程序中,登录页面是最重要的,启动了许多其他功能),因此上面的DB点击量不会太多。 以上内容不依赖于用户注销。 没有涉及IP地址(其他人已经提到,它有自己的问题) 它一次只允许一个用户登录,并注销“较老”的用户

希望能有帮助
NeoToren

在会话变量中存储一个值。在允许访问登录页面之前,请检查此变量。如果两个用户使用相同的凭据,则表示他们是同一用户。所以你的意思是:防止一个用户多次登录。啊,你的意思是从两个不同的浏览器?如果是这样,您需要将信息保存在服务器上。同时捕获会话超时可能重复。不。我看到了这个问题,但与我的要求不同,因为我希望允许新用户登录并注销前一个登录用户。当用户关闭浏览器或我的应用程序中的服务器崩溃时,我使用了会话超时。我感谢您的帮助,但当用户从不同的机器登录时,这不会有帮助。您是否运行不同的计算机应用服务器?如果它是同一应用程序服务器下的同一应用程序,为什么没有帮助?应用程序服务器是相同的。但是将为两个登录创建两个会话,那么如何比较两个用户?