Vaadin在另一个浏览器/标签/系统中关闭同一用户的UI

时间:2013-09-03 14:17:49

标签: session login vaadin7

我正在Vaadin 7做一个项目。我需要为登录实现类似下面的内容。

用户“A”已登录系统“1”。他再次登录另一个系统'2'。现在我想知道如何关闭系统'1'上的UI。

我试过了能够关闭UI的东西,如果是同一个浏览器的话。但是,对于不同的系统/浏览器。我什么都不知道。

我的代码:

private void closeUI(String attribute) {
        for (UI ui : getSession().getUIs()) {
            if(ui.getSession().getAttribute(attribute) != null)
                   if(ui.getSession().getAttribute(attribute).equals(attribute))
                         ui.close();

            }
}

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我的情况类似于我需要显示有关所有会话的几个信息。我做的是我创建了自己的Servlet,使用静态ConcurrentHashmap扩展VaadinServlet以保存我的会话信息,并创建一个SessionDestroyListener以在注销时从地图中删除任何信息。最初我还有一个SessionInitListener,我在hashmap中添加了信息但是我意识到我在认证后只有用户信息,所以我将这部分移到了处理登录的页面。

我想你可以做类似的事情,或者至少这应该让你开始:

public class SessionInfoServlet extends VaadinServlet {

  private static final ConcurrentHashMap<User, VaadinSession> userSessionInfo = new ConcurrentHashMap<>();

  // this could be called after login to save the session info
  public static void saveUserSessionInfo(User user, VaadinSession session) {
    VaadinSession oldSession = userSessionInfo.get(user);
    if(oldSession != null){
      // close the old session
      oldSession.close();
    }
    userSessionInfo.put(user, session);
  }

  public static Map<User, VaadinSession> getUserSessionInfos() {
    // access the cache if we need to, otherwise useless and removable
    return userSessionInfo;
  }

  @Override
  protected void servletInitialized() throws ServletException {
    super.servletInitialized();
    // register our session destroy listener
    SessionLifecycleListener sessionLifecycleListener = new SessionLifecycleListener();
    getService().addSessionDestroyListener(sessionLifecycleListener);
  }

  private class SessionLifecycleListener implements SessionDestroyListener {
    @Override
    public void sessionDestroy(SessionDestroyEvent event) {
      // remove saved session from cache, for the user that was stored in it
      userSessionInfo.remove(event.getSession().getAttribute("user"));
    }
  }
}