2012-11-15 22 views

回答

4

添加您的註銷代碼到上onunload事件。

window.onunload = function() { 
    //logout code here... 
} 

在JQuery中,您可以使用.unload()函數。請記住,您沒有太多時間來發送Ajax請求,但結果可能無法到達客戶端。

另一個竅門是打開一個小小的新窗口並在那裏處理註銷。

window.open("logout url","log out","height=10,width=10,location=no,menubar=no,status=no,titlebar=no,toolbar=no",true); 

如果要禁用關閉窗口(或至少提醒用戶),您可以使用此代碼:

window.onbeforeunload = function(event) { 
    //if you return anything but null, it will warn the user. 
    //optionally you can return a string which most browsers show to the user as the warning message. 
    return true; 
} 

另一個竅門是繼續ping服務器客戶端每隔幾秒鐘。如果沒有回覆,假設用戶關閉了窗口,瀏覽器崩潰或者網絡問題無論如何都結束了聊天會話。在客戶端,如果您沒有收到此ping包,則可以假定網絡連接或服務器出現問題,並且可以顯示註銷警告(並可以讓用戶再次登錄)。

+0

但不可能調用服務器和保障,使之到服務器。 – epascarello

+0

然後你可以打開一個小的彈出窗口來照顧它或使用window.onbeforeunload事件處理程序來警告用戶。 – AlexStack

+0

彈出窗口會被彈出式窗口攔截被阻塞,再加上它仍然錯過所有的邊緣情況。 – epascarello

1

某些網站正在使用以下腳本來檢測窗口是否關閉。

if(window.screenTop > 10000) 
alert("Window is closed"); 
else 
alert("Window stillOpen"); 

您需要添加正確的行動,而不是alert()

也看看HERE - 我認爲這是財產以後,你需要檢測窗關閉

9

有做沒有確切的辦法這與客戶端。頁面退出時沒有事件被觸發。應該使用服務器上的會話結束事件來完成。

您可以嘗試使用onbeforeunload或unload,但競態條件會阻止這種情況發生。他們不火瀏覽器崩潰,失去互聯網連接等

+0

謝謝,我有一個想法... –

1

我的解決方案,

window.onunload = function() { 
    //logout code here... 
} 

感謝所有誰支持我...

+0

這應該是張貼評論 – Beppe

1

另一種方法是某種「keepalive」:瀏覽器頁面每分鐘左右「ping」一個小的ajax請求的服務器。如果服務器沒有獲得常規ping,則該會話將關閉並且不能再使用。

作爲一種優化,如果我們在此期間向服務器提出了另一個請求,則可以跳過ping。

優點:

    • 仍然有多個窗口打開
    • 與F5沒有問題/刷新
    • 可以提供一些使用統計數據到服務器

    缺點作品

  • 當窗口是封閉的,有一個延遲的用戶將被註銷
  • 使用一個小的網絡帶寬
  • 額外的負載在服務器
  • 用戶可能會提供有關網頁不斷地「打電話回家」的擔憂
  • 更難實現之前

我從來沒有真正在網絡應用程序中做過這件事,也不確定我會不會;只是把它放在那裏作爲替代。這似乎是一個聊天應用程序的好選擇,服務器確實需要知道你是否還在那裏。

而不是輪詢/ pinging,另一種可能性是在頁面打開時保持「長時間運行的請求」打開。聊天應用程序需要一些這樣的套接字來接收新的消息和通知。如果頁面關閉,套接字也會關閉,服務器可能會注意到它已關閉。然後等待客戶端建立一個新套接字的短暫時間,如果沒有,我們假定該頁面已關閉並刪除會話。這需要服務器上一些稍微不尋常的軟件。

1

我最近在我的angularJS應用程序中處理了這個問題 - 主要問題是如果刷新,我不想讓您註銷,但是我確實希望關閉該選項卡。使用onbeforeunload/onunload的都不能保證等待迴應,所以這裏是我的解決方案:

我設置登錄時的sessionStorage的cookie,這只是一個布爾 - 設置爲true,當我登錄響應

sessionStorage.setItem('activeSession', 'true');

顯然,在註銷時,我們將此標誌設置爲假

當控制器初始化或使用window.onload(在我的app.js文件中) - 我檢查這個activeSession bool ..如果是假的,我有這個小if語句 - 其中,如果條件得到滿足我打電話給我的註銷方法ONLOAD替代onunload的

var activeSession = sessionStorage.activeSession; 
    if (sessionStorage.loggedOutOnAuth) { 
     console.log('Logged out due to expiry already') 
    } 
    else if (!activeSession) { 
     sessionStorage.loggedOutOnAuth = true; 
     _logout() 
    } 

基本上,「loggedOutAuth」布爾讓我知道,我只是過期您在頁面加載因缺乏的sessionStorage的activeSession的這樣你就不會陷入循環

因爲我沒有想實現一個心跳/ WebSocket的

0

我這是一個很好的解決方案,我在這裏遇到了這個問題,我帶着一個不同的解決方案:

checkSessionTime(); 
    $interval(checkSessionTime, 2000); 
    function checkSessionTime() { 
     var now = (new Date()).getTime(); 
     if (!$localStorage.lastPing) { 
      $localStorage.lastPing = now; 
     } 

     if ($localStorage.lastPing < now - 5000) { 
      $localStorage.lastPing = undefined; 
      AuthService.logout(); 
     } else { 
      $localStorage.lastPing = now; 
     } 
    } 

我喜歡這個解決方案,因爲它不會增加對服務器的開銷,也不依賴於窗口卸載事件。此代碼被放入$app.run

我使用的角度與JWT身份驗證,這樣一來給我註銷僅僅意味着擺脫了身份驗證令牌的。然而,如果你需要完成建立會話的服務器端你可以建立驗證服務結束會話時,而不是繼續ping到maitain會議活着做一平。

這solutionsolves我的情況下會引起我的intetion只是爲了防止不必要的用戶,當他們關閉的標籤,去遠離PC訪問某人的帳戶。

0

經過大量的搜索我在C#寫了下面的定製代碼的JavaScript和服務器端代碼會殺。

下面的代碼擴展在同一個網站的情況下,在打開多個選項卡,因此會話存活至網站的一個選項卡打開

//Define global varible 
var isCloseWindow = false; 

//Jquery page load function to register the events 

$(function() { 
     //function for onbeforeuload 
     window.onbeforeunload = ConfirmLeave; 
     //function for onload 
     window.onload = ConfirmEnter; 

     //mouseover for div which spans the whole browser client area 
     $("div").on('mouseover', (function() { 
     //for postback from the page make isCloseWindow global varible to false 
      isCloseWindow = false; 
     })); 
     //mouseout event 
     $("div").on('mouseout', (function() { 
    //for event raised from tabclose,browserclose etc. the page make isCloseWindow global varible to false 
      isCloseWindow = true; 
     })); 
    }); 
    //Key board events to track the browser tab or browser closed by ctrl+w or alt+f4 key combination 
    $(document).keydown(function (e) { 
     if (e.key.toUpperCase() == "CONTROL") { 
      debugger; 
      isCloseWindow = true; 
     } 
     else if (e.key.toUpperCase() == "ALT") { 
      debugger; 
      isCloseWindow = true; 
     } 
     else { 
      debugger; 
      isCloseWindow = false; 
     } 
    }); 

    function ConfirmEnter(event) { 
     if (localStorage.getItem("IsPostBack") == null || localStorage.getItem("IsPostBack") == "N") { 
      if (localStorage.getItem("tabCounter") == null || Number(localStorage.getItem("tabCounter")) == 0) { 
       //cookie is not present 
       localStorage.setItem('tabCounter', 1); 

      } else { 
       localStorage.setItem('tabCounter', Number(localStorage.getItem('tabCounter')) + 1); 
      } 
     } 
     localStorage.setItem("IsPostBack", "N"); 
    } 
    function ConfirmLeave(event) { 
     if (event.target.activeElement.innerText == "LOGOUT") { 
      localStorage.setItem('tabCounter', 0); 
      localStorage.setItem("IsPostBack", "N"); 
     } else { 
      localStorage.setItem("IsPostBack", "Y"); 
     } 
     if ((Number(localStorage.getItem('tabCounter')) == 1 && isCloseWindow == true)) { 
      localStorage.setItem('tabCounter', 0); 
      localStorage.setItem("IsPostBack", "N"); 
      **Call Web Method Kill_Session using jquery ajax call** 
     } else if (Number(localStorage.getItem('tabCounter')) > 1 && isCloseWindow == true) { 
      localStorage.setItem('tabCounter', Number(localStorage.getItem('tabCounter')) - 1); 
     } 
    } 

//C# server side WebMethod 
[WebMethod] 
    public static void Kill_Session() 
    { 
     HttpContext.Current.Session.Abandon(); 
    } 
相關問題