【问题标题】:How to add Logout from all other session如何从所有其他会话中添加注销
【发布时间】:2017-12-07 20:24:46
【问题描述】:

我的情况是有两个不同的用户使用相同的用户 ID 和密码登录。同时其中一个人通过提供当前密码来更改密码。并同时更改了密码,另一个用户提供了他登录的当前密码不正确。所以我想在我的网络应用程序中添加从所有其他设备的注销。我该怎么做

【问题讨论】:

  • 欢迎来到 SO!请阅读How to askHow to create a Minimal, Complete, and Verifiable 示例,然后更新您的问题。简而言之:不要写一篇文章来解释你(想要)做什么,而是展示你的代码(到目前为止你尝试过什么)。
  • 但是我必须解释的场景..我不知道该怎么做
  • 您需要共享代码。如果不是为了这个,至少你可以分享你如何创建会话,你在哪里存储数据等
  • 为什么不设置多个用户?
  • 我正在使用 MySQL 来存储用户数据.. 我根本没有创建任何会话..

标签: javascript java mysql jsp session


【解决方案1】:

当然有不止一种方法,我的第一个想法是将会话挂接到ServletContext。类似的东西

// this can be in some util class, let's call it SessionUtil
static final String SESSION_REGISTER = "session.register";
public static synchronized void registerSession(ServletRequest req, HttpSession ses, String userName) {
  ServletContext ctx = req.getServletContext();
  Map<String, List<HttpSession>> register = (Map<String, List<HttpSession>>) ctx.getAttribute(SESSION_REGISTER);
  if (register == null) {
    register = new HashMap<>();
    ctx.setAttribute(SESSION_REGISTER, register);
  }
  List<HttpSession> sessions = register.computeIfAbsent(userName, k -> new ArrayList<>());
  sessions.add(ses);
}

然后,在你的代码中,你需要在登录后注册用户的会话:

HttpSession ss = request.getSession(); 
if (isUser(name,password)) { 
  ss.setAttribute("user",name) 
  SessionUtil.registerSession(request, ss, name);
}

最后,您需要一个方法(同样在SessionUtil 类中)使所有用户的会话(当前会话除外)无效:

public static synchronized void invalidateSessions(ServletRequest req, HttpSession current, String userName) {
  ServletContext ctx = req.getServletContext();
  Map<String, List<HttpSession>> register = (Map<String, List<HttpSession>>) ctx.getAttribute(SESSION_REGISTER);
  if (register != null) {
    List<HttpSession> sessions = register.get(userName);
    if (sessions != null) {
      for (HttpSession ses : sessions) {
        if (!ses.equals(current)) {
          ses.invalidate();
        }
      }
    }
  }
}

然后您可以调用此方法,例如当用户更改他/她的密码时。

注意 #1: 不是一个很好的代码,它错过了一些健全性检查,synchronized 可以是更小的代码块。只是给你一个想法。

注意#2:registerSession(...)方法的功能可以使用HttpSessionAttributeListener来完成,但我还没用过,所以不能举个例子。

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2013-06-06
    • 2016-02-03
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多