2012-08-01 81 views
0

在我的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"; 
} 

回答

1

這是不可能的,你想要的方式。同一瀏覽器實例的所有窗口/選項卡共享相同的會話。

要實現這一點,您需要創建一個視圖,其中包含有條件渲染的視圖和一個視圖範圍的bean,其中存儲與視圖相關的所有內容,並始終從操作方法返回voidnull。這樣你根本不需要會話範圍。要創建新視圖,只需發送新的GET請求(如新選項卡)或從操作方法返回一個非null字符串。

1

這大概是太晚了,但因爲我已經看到了一些關於這個在網絡上的問題,我可能只是把我的解決方案在這裏,我已在Chrome和Firefox(所有最新的版本雖然)

測試

設置:一個更優雅的解決方案是使用過濾器,但我已經使用prerender事件(使用單個模板爲我的整個網站,因此我可以跟蹤何時加載每個頁面,並且我已指定prerender事件模板)

的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(); 
} 

}

JavaScript代碼進行Ajax請求呈現之前

這種方法被稱爲是一個#1回答禮貌。

相關問題