Session Vaadin在另一个浏览器/选项卡/系统中关闭同一用户的UI

Session Vaadin在另一个浏览器/选项卡/系统中关闭同一用户的UI,session,login,vaadin7,Session,Login,Vaadin7,我在瓦丁7号做一个项目。在这方面,我需要为登录实现如下内容 用户“A”已登录到系统“1”。他再次登录到另一个系统“2”。现在我想知道如何关闭系统“1”上的UI 我尝试了一些东西,可以关闭UI,如果它是相同的浏览器。但是,对于不同的系统/浏览器。我不知道 我的代码: private void closeUI(String attribute) { for (UI ui : getSession().getUIs()) { if(ui.getSession()

我在瓦丁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();

            }
}

有人能帮我吗?

我的情况与您的情况类似,我需要显示有关所有会话的一些信息。我所做的是创建了自己的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"));
    }
  }
}
公共类SessionInfoServlet扩展了VaadinServlet{
私有静态最终ConcurrentHashMap userSessionInfo=新ConcurrentHashMap();
//登录后可以调用此命令以保存会话信息
公共静态void saveUserSessionInfo(用户用户,VaadinSession会话){
VaadinSession oldSession=userSessionInfo.get(用户);
if(oldSession!=null){
//关闭旧会话
oldSession.close();
}
userSessionInfo.put(用户,会话);
}
公共静态映射getUserSessionInfo(){
//如果需要,可以访问缓存,否则将无用且可移动
返回userSessionInfo;
}
@凌驾
受保护的void servletInitialized()引发ServletException{
super.servletilized();
//注册我们的会话侦听器
sessionLifeCycleStener sessionLifeCycleStener=新sessionLifeCycleStener();
getService().addSessionDestroyListener(sessionLifeCycleStener);
}
私有类SessionLifecycleListener实现SessionDestroyListener{
@凌驾
public void sessionDestroy(SessionDestroyEvent事件){
//从缓存中删除存储在其中的用户的已保存会话
移除(event.getSession().getAttribute(“用户”);
}
}
}

我也有同样的问题。但是你的代码对我无效。你设置了会话属性了吗。试试这个。getUI().getSession().setAttribute(属性,属性);来自同一项目的“system 1”和“system 2”Vaadin应用程序是否在同一个tomcat下运行?@Grove Yeah。。两者都是在同一个tomcat下运行的同一个应用程序。谢谢Grove。这对我来说确实是一个很好的暗示。我会努力的。没问题,很高兴能帮上忙这工作怎么样?我尝试了这段代码,用相同的登录名在两个不同的浏览器上打开了应用程序,它打开了,两个会话处于活动状态,因为我认为userSessionInfo是空的everytime@user2137817如果
get
始终返回null,则永远不会调用
put
。您是在登录时还是在应用程序中的任何位置调用
saveUserSessionInfo
?我在登录后调用saveUserSessionInfo。调用yes put,但每次我在不同浏览器上运行应用程序时,hashmap再次为空。