【问题标题】:checkout when you close the tab关闭选项卡时结帐
【发布时间】:2012-07-30 16:31:02
【问题描述】:

在我使用 Java EE 和 JSF 2.0 的应用程序中,我希望当用户关闭应用程序的选项卡时会话结束。如果此用户在应用程序中打开了另一个选项卡,则不应关闭此另一个选项卡的会话。这样做是为了不打扰应用程序的管理。

结束我使用的会话:

public String deconnecter() {
    //invalidate user session
    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
    session.invalidate();
    return "login";
}

【问题讨论】:

    标签: java javascript session jsf


    【解决方案1】:

    这不可能如你所愿。同一浏览器实例的所有窗口/选项卡共享同一会话。

    无论如何,要实现这一点,您需要创建一个带有条件渲染包含的视图和一个视图范围的 bean,您可以在其中存储与视图相关的所有内容,并始终从操作方法返回 voidnull。这样,您根本不需要会话范围。要创建新视图,只需发送一个新的 GET 请求(如新选项卡)或从操作方法返回一个非null 字符串。

    【讨论】:

      【解决方案2】:

      这可能为时已晚,但由于我在网上看到了许多与此相关的问题,所以我可能只是把我的解决方案放在这里,我已经在 chrome 和 firefox 上进行了测试(不过是所有最新版本)

      设置:更优雅的解决方案是使用过滤器,但我使用了预渲染事件(对我的整个网站使用单个模板,因此我可以跟踪每个页面的加载时间,并且我已经指定了预渲染事件模板)

      Javascript 部分:

          window.onbeforeunload = function(){
            //log out of the server too.
            var xmlhttp;
            if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
              xmlhttp=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            var url = '/context/index.xhtml?onunload=true';
            xmlhttp.open('GET', url, true);
            xmlhttp.send();
          }
           window.onload = function(){
            console.log('window name: '+window.name);
            if(window.name != '#{controller.sessionId}'){
              window.name = '#{controller.sessionId}';
              var xmlhttp;
              if (window.XMLHttpRequest)
              {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
              }
              else
              {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
              }
              var url = '/context/index.xhtml?onload=true';
              xmlhttp.open('GET', url, true);
              xmlhttp.send();
            }
          }
          //Called when user logs out.
          function onLogout(){
            console.log('logging out: '+window.name);
            window.name = '';
            console.log('logged out: '+window.name);
          }
      

      服务器端代码:

      在视图在预渲染事件上渲染之前调用此方法

      public void trackUserTabs() {
      String onload = Controller.getParameter(ONLOAD_ID);
      if (onload != null && onload.trim().equals("true")) {
        openedTabs++;
        System.err.println("onload: " + controller.getCurrentPrinciple() + "..........." + openedTabs);
      }
      String onunload = Controller.getParameter(ONUNLOAD_ID);
      if (onunload != null && onunload.trim().equals("true")) {
        openedTabs--;
        System.err.println("onunload: " + controller.getCurrentPrinciple() + ".............." + openedTabs);
      }
      if (openedTabs <= 0 && controller.getCurrentProfile() != null) {
        /**
         * All tabs are closed, log out current user.
         */
        controller.logoutCurrentProfile();
      }
      

      }

      ajax 请求的 javascript 代码由 Stackoverflow 中的答案提供。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        • 2021-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多