2010-08-12 93 views
2

我在PHP應用程序工作,但我有麻煩,事實上,當用戶註銷並按下瀏覽器後退按鈕後,他可以看到前一頁,就好像會議並沒有被破壞:((我已經嘗試了所有,我在這裏和在網絡上找到,但它不工作:「(防止登出後顯示以前的頁面

我能禁用後退按鈕

+0

我不認爲你可以在瀏覽器中 – mint 2010-08-12 12:11:24

+1

可能重複禁用後退按鈕[禁用瀏覽器的後退按鈕(http://stackoverflow.com/questions/961188/disable-瀏覽器後退按鈕) – thomasrutter 2010-08-12 12:12:34

+1

另一個重複:http://stackoverflow.com/questions/3359941/how-to-disable-back-button-navigation-on-certain-pages – thomasrutter 2010-08-12 12:12:50

回答

0

您不能禁用後退按鈕?在用戶的瀏覽器上,這是瀏覽器的一個基本特性,它不能被覆蓋。

你可以讓你的應用程序中斷(disp如果用戶返回,則會顯示錯誤消息,要求用戶重新開始或重新提交請求)。這樣做是一個壞主意,因爲它確實承認在設計應用程序時沒有考慮後退按鈕。每個應用程序,甚至是訂購表格,購物車等,如果設計正確,應該能夠使用後退按鈕。

我看到的一種破解後退按鈕的方法是在應用程序中的每個URL上以及每個表單內傳遞一個令牌。每個頁面都會重新生成令牌,一旦用戶加載新頁面,前一頁中的任何令牌都將失效。

當用戶加載一個頁面時,該頁面只會顯示是否將正確的標記(已賦予前一頁上的所有鏈接/表單)傳遞給該頁面。

我的銀行提供的網上銀行申請就是這樣。如果您完全使用後退按鈕,則不會再有鏈接工作,也無法再進行頁面重新加載 - 相反,您會看到一條通知,告訴您無法返回,並且必須重新開始。

這就是說,我應該提醒你,當用戶返回時,使得你的應用程序崩潰是一個壞主意,並且顯示糟糕的應用程序設計。

+0

這甚至沒有開始解決這個問題 – aaronasterling 2010-08-12 12:27:14

0

您是否清除用戶的緩存/會話?即使他們反擊,我認爲如果您在註銷時清除會話,他們也不應該讓他們登錄。

0

您無法禁用後退按鈕。如果您可以看到以前註銷的用戶頁面,則會話檢查腳本在某處失敗。提交註銷表單時使用流程腳本,然後將當前註銷的用戶重定向到主頁面(如果適用)。

0

你不能。瀏覽器緩存頁面,以便他們不必在每次加載頁面時從Web服務器請求它。當你點擊後退按鈕時,它會在不詢問服務器的情況下加載最後一頁。

1

這可能與您在每個頁面請求上發回的緩存標題有關。您的內容僅在短時間內有效,因此您需要確保在生成頁面時向頁面發回報告,告訴瀏覽器不要在本地緩存它。這裏禁用頁面緩存http://www.w3schools.com/php/func_http_header.asp

例子:

// Date in the past 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Cache-Control: no-cache"); 
header("Pragma: no-cache"); 
2

http://blog.priyakant.com/2014/09/23/browser-back-button-prevent/

摘要:

瀏覽器後退按鈕 - 防止註銷後前幾頁中顯示 - 基於Cookie的方式 發表於九月23,2014作者:Priyakant Patel - 發表評論 註銷後禁止顯示以前的頁面

由於性能原因,客戶端瀏覽器應用程序緩存頁面。在這種情況下,當用戶點擊後退(瀏覽器後退按鈕)時,它會顯示緩存中的上一頁。

案例1:用戶仍然登錄

是OK顯示前一頁的內容。

情況2:用戶已註銷。

潛在的下一個用戶可以點擊瀏覽器後退按鈕,並可以看到前一頁的內容。

這可能是許多應用程序中的大問題。在財務應用程序中,下一個用戶可能會看到財務數據或醫療/患者相關的應用程序,這可能是違反HIPAA和公司可能面臨重大處罰。

那麼讓我們回到這一點,如何解決這個問題?

我建議基於HTTP Cookie的方法。

步驟:

從服務器端滑動到期創建HTTP Cookie。可以從客戶端JavaScript訪問哪些內容(注意:瀏覽器在到期時清除此Cookie)。
註銷時清除此cookie
如果您沒有找到該Cookie,請重新加載該頁面。在這種情況下,服務器重新驗證頁面,如果有必要,它將重定向到登錄頁面
就是這樣,完成!

這是我使用ASP.NET的實現。實施將根據服務器技術而有所不同,但想法保持不變。

  1. (服務器端)。從服務器端創建HTTP滑動過期

    Response.SetCookie(new HttpCookie(「TimeoutCookieName」, "1") { Expires = DateTime.UtcNow.AddMinutes(10) }); 
    //NOTE 10 == Session Timeout. This will be same as your application login session timeout. 
    
  2. (服務器端)。退出時清除這個cookie

    Response.SetCookie(new HttpCookie(「TimeoutCookieName」, "1") { Expires = DateTime.UtcNow}); 
    
  3. (客戶端):(下面的腳本必須BODY標籤後立即存在)

    window.preventBackButton = function() { 
        try { 
         if (document && (!document.cookie || document.cookie.indexOf('_tc=1') < 0)) { 
          window.document.body.style.display = 'none'; window.location = window.location; 
         } 
        } catch (e) { } 
    }; 
    window.preventBackButton(); //Call immediately after body tag 
    

請找ASP。NET實現如下:

////C# Helper class - Start 
using System; 
using System.Web; 

namespace MyHelpers { 
    public static class MyHtmlHelper { 
     public const string TimeoutCookieName = "_tc"; 

     public static HtmlString PreventBackButtonScript(HttpResponseBase response) { 
      response.SetCookie(new HttpCookie(TimeoutCookieName, "1") { Expires = DateTime.UtcNow.AddMinutes(10) }); 
      var clientScript = "window.-reventBackButton = function() { 
       try { 
        if(document && (!document.cookie || document.cookie.indexOf('" + TimeoutCookieName + "=1') < 0)) { 
         window.document.body.style.display='none'; window.location = window.location; 
        } 
       } catch(e) {} 
      }; 
      window.preventBackButton();"; 

      return new HtmlString(clientScript); 
     } 

     public static void SafeUnSetTimeoutCookie(this HttpResponseBase response) { 
      response.SetCookie(new HttpCookie(TimeoutCookieName, "0") { Expires = DateTime.UtcNow.AddYears(-5) }); 
     } 
    } 
} 
////C# Helper class - End 
//Shared\_Layout.cshtml 
//Make sure not to include after logout OR login page 
<html> 
<body> 
@MyHelpers.MyHtmlHelper.PreventBackButtonScript(Response) 
. 
. 
<⁄body> 
<⁄html>