2016-02-17 43 views
1

我有一個基於登錄的站點,我想在用戶離開站點時(即關閉瀏覽器或關閉標籤)登錄用戶。我知道這不是以任何方式防止欺騙的,但我想盡可能地把它設置得儘可能好。當用戶在卸載時註銷時,它們也會在重新加載時被註銷

我使用下面的代碼:

$(window).unload(function() { 
    //Send an Ajax request to logout.php 
    $.ajax({ 
     type: "POST", 
     url: "scripts/logout.php" 
    }) 
}); 

而且logout.php只是會取消會議。

在關閉網站時,它可以正常工作,但它工作得很好,這意味着它在頁面重新加載或單擊站點內鏈接時也會觸發。我該如何防止這種行爲,即檢查用戶的操作實際上是關閉瀏覽器還是遠離網站導航,而不是重新加載或訪問其他網站部分?

+0

很明顯,每次重新加載站點時都會觸發,因爲窗口將重新啓動。只需依靠瀏覽器會話,瀏覽器關閉時會自動過期。 – Kalkran

+0

對於php標籤感到好奇,如果沒有代碼來支持該問題以及會話。 –

+0

@Kalkran我意識到現在,問題是,有沒有什麼方法可以使Javascript區分這些事件?至於瀏覽器會話到期,當我關閉標籤或導航到另一個網站時,它們不會過期。 – jovan

回答

0

我只是想讓每個人都知道我是如何解決這個難題的。

最後,我放棄了Javascript中的unload函數的想法,並採用了JS/PHP的組合解決方案。

當用戶在該網站上,這AJAX觸發每隔10秒:

$.ajax({ 
    type: "POST", 
    url: "scripts/resession.php" 
}); 

目標PHP更新用戶的數據庫last_active統計:

<?php 
session_start(); 
include('../includes/db.php'); 

if(isset($_SESSION['isloggedin'])){ 
    $_SESSION['last_active']=time(); 
    mysql_query("update users set last_active='$_SESSION[last_active]' where id='$_SESSION[user_id]' "); 
} 
?> 

上打開用戶只有網站上的頁面,我們只需檢查用戶是否在最近20秒內處於活動狀態。如果不是,這意味着他們已經離開了現場的同時,我們將他們註銷並重定向到登錄頁面:

if(isset($_SESSION['isloggedin'])){ 
    $result = mysql_query("select last_active from users where id='$_SESSION[user_id]' "); 
    $lainfo = mysql_fetch_assoc($result); 
    //if more than 20s of inactivity, that means our user has left the site in the meanwhile and they should be logged out 
    if($lainfo['last_active'] + 20 < time()){ 
     unset($_SESSION['isloggedin']); 
     unset($_SESSION['user_id']); 
     unset($_SESSION['last_active']); 
     header("location:welcome.php"); 
     exit; 
    } 
} 

這不是最理想的,它有一個10-20第二階段中,他們可以來返回並仍然登錄 - 但實際上有它的特權,因爲可能會出現用戶忘記執行某些操作並在關閉後立即返回的情況,因此在這種情況下必須重新登錄纔會令他們感到煩惱。