2011-03-13 33 views

回答

9

還有就是要做到這一點立即當客戶關閉瀏覽器沒有可靠的方法。有beforeunload事件,但即使如此,當您在此事件期間發出ajax請求時,也無法保證到達服務器。儘管如此,您還是遇到了多個瀏覽器選項卡的問題。

最可靠的方法是在服務器端(例如1分鐘)具有相對較短的會話超時並在客戶端引入基於Ajax的心跳(例如,每30秒)以保持會話存活。

有可能是因爲您所想,這是解決方案的唯一功能要求更好的方法。例如,如果您實際意圖是所有的登錄限制在1元註冊用戶,那麼你最好收集所有的登錄和相關的會議,然後比較這對每一個登錄名和無效的,如果存在的任何先前的會話。這種方式在JS禁用的客戶端上也可以工作。

1

一個可行的技術是使用AJAX來保活請求發送到您的服務器經常 - 例如每一分鐘。然後,如果沒有按預期收到保持活動狀態(或幾個順序),則可以立即放棄會話。

否則,有實現,沒有可靠的方法。由於瀏覽器和服務器之間沒有持久連接,因此無法檢測到您可能在瀏覽器中運行的任何JavaScript代碼無法控制的情況。例如,當網絡出現故障時,即使瀏覽器的窗口仍處於打開狀態,您也可能要關閉會話。因此,爲了使系統足夠強大,您應該檢測網絡中斷,作爲瀏覽器保持活動機制的「副作用」(例如,像Gmail那樣)。

1

除非你使用的WebSockets或某種長輪詢每個追蹤「實時」與客戶端的連接選項卡,你可能要等到會話超時在服務器端。

0

您可以通過jQuery,Ajax和PHP 的組合做了jQuery

function updatestatusOFF(){ 
     // Assuming we have #shoutbox 
     $('#connection').load('connection.php?user=<?php echo $_SESSION['username']; ?>&offline=true'); 

    } 

卸載腳本之前

<script>window.onbeforeunload = function() { return updatestatusOFF(); }</script> 

和PHP,你會寫自己,我」你可以做更多的事情。 它不是最可靠的,但它是實現這一點最簡單的方法。如果你想實時報告..看看彗星

2

如果你不使用cookies來保存用戶的登錄信息,它應該日誌他們時,他們關閉瀏覽器,因爲任何會話cookie應該被殺死當瀏覽器關閉時。

顯然這並非總是如此(Firefox登錄後保留登錄信息的see here for an example),因爲「會話恢復」功能我們現在模糊了被視爲「單一瀏覽器會話」之間的界限。 (我個人認爲這應該被歸類爲一個錯誤,但那只是我的看法)。

有兩種可能的技術。第一個是(正如yojimbo87在我之前提到的)使用web套接字來保持客戶端和服務器之間的連接,並且當套接字關閉時,終止會話。這裏的問題是,網絡套接字支持是有限的,並且除了出血性邊緣瀏覽器(FF4,Chrome,IE9等)之外肯定不可能。

另一種方法是使用AJAX不斷輪詢服務器,告訴它該頁面仍在被查看,所以如果你例如每隔30秒通過AJAX發送一個保持活動請求,會話中請求的時間戳。如果用戶回到頁面,並且當前請求和最後一個請求之間的時間差異超過45秒(考慮延遲),您就會知道用戶關閉了瀏覽器並需要登錄再次。

在這兩種情況下,但是有一個致命的缺陷,那就是它們依賴於JavaScript。如果用戶沒有啓用JavaScript,那麼最終會以不斷的登錄提示破壞用戶體驗,這顯然是一個糟糕的主意。

在我看來,我認爲其合理單純依靠會話cookie被當用戶關閉瀏覽器窗口瀏覽器中刪除,因爲這是他們應該做的事情。當客戶端瀏覽器執行不合需要的行爲時,作爲開發人員不能被指責,因爲它完全不在您的手中,並且沒有功能性的解決方法。

相關問題