2015-06-13 53 views
12

我有以下logout()函數適用於大多數瀏覽器,但不適用於safari。 safari中的問題是註銷後,如果用戶點擊後退按鈕,他們會從緩存中取代上一頁,而不是登錄屏幕。有沒有辦法調整註銷功能來處理這個問題?調整註銷功能來處理safari後退按鈕問題

function logout() 
{ 
    // unset any session variables 
    $_SESSION = []; 

    // expire cookie 
    if (!empty($_COOKIE[session_name()])) 
    { 
     // setcookie(session_name(), "", time() - 42000); 
     $params = session_get_cookie_params();    
     setcookie(session_name(), '', time() - 42000, 
       $params["path"], $params["domain"], 
       $params["secure"], $params["httponly"]); 
    } 

    // destroy session 
    session_destroy();   
} 
+0

我不und爲了解決這個問題的原因,請詳細解釋您嘗試解決的問題:) – mattfryercom

+1

在safari中,如果有人註銷並離開終端,其他人可以點擊後退按鈕並查看以前的位置用戶是 – DCR

+0

我現在明白了,有一點想法:) – mattfryercom

回答

1

在我看來,這是一個瀏覽器問題,而不是服務器問題。

  1. 您是否嘗試配置緩存標頭以禁止緩存記錄的頁面?

  2. 作爲另一種解決方案,我找到了一個關於SO的帖子:Preventing cache on back-button in Safari 5

你可以試試這個解決方案,它基本上是把這個JavaScript在您的登錄頁面:

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload() ; 
    } 
}; 

要只重新加載頁面註銷你可以檢查有沒有餅乾後,使得回按鈕在登錄時仍然工作。只需將"yourCookieName"字符串更改爲您的會話cookie名稱即可。

function getCookie(cname) { 
    var name = cname + "="; 
    var ca = document.cookie.split(';'); 
    for(var i=0; i<ca.length; i++) { 
     var c = ca[i]; 
     while (c.charAt(0)==' ') c = c.substring(1); 
     if (c.indexOf(name) == 0) return c.substring(name.length, c.length); 
    } 
    return null; 
} 

function hasCookie(cname) { 
    return getCookie(cname) !== null; 
} 

window.onpageshow = function(event) { 
    if (event.persisted && !hasCookie("yourCookieName")) { 
     window.location.reload(); // or redirect to login page 
    } 
}; 

注:我認爲會在Safari中仍然存在與解決方案2.緩存那麼,這是不是真的處理在我看來,正確的安全解決方案。

+1

以上都不是。仍在尋找答案 – DCR

1

使用重定向功能,在你的代碼一樣

function logout() 
{ 
    // unset any session variables 
    $_SESSION = []; 


    // expire cookie 
    if (!empty($_COOKIE[session_name()])) 
    { 
     // setcookie(session_name(), "", time() - 42000); 
     $params = session_get_cookie_params();    
     setcookie(session_name(), '', time() - 42000, 
       $params["path"], $params["domain"], 
       $params["secure"], $params["httponly"]); 
    } 

// to redirect the user to login page 

$return_url = "login.php"; //I'm using login.php you can change it according to your page 

// destroy session 
session_unset(); 
session_destroy(); 

header('Location:'.$return_url); //to redirect to user 
} 

而且還用它來驗證用戶會話由

session_start(); 
if($_SESSION[name]=="") { 
header("location:index.php"); 
} 

注意存在與否:需要在所有頁面進行驗證用戶訪問 頁如果只有會話

+0

它如何影響Safari的緩存機制? – Mat

+0

我更新了代碼... – Bruce