2009-10-16 121 views
10

當用戶點擊後退按鈕時,瀏覽器顯示無處不在的「此頁面已過期」消息的要求是什麼?在後退按鈕上顯示「網頁已過期」

什麼是一些用戶友好的方法來防止用戶使用webapp中的後退按鈕?

+4

更好地將設計您的應用程序,以便後退按鈕具有明智的意義。當我'不允許'使用後退按鈕時,我覺得它很生氣。 – Peter 2009-10-16 20:18:58

+0

彼得,我同意。有時您可能會試圖阻止用戶返回,因此有時(例如電子商務網站的結帳流程)。但是,我的答案中提出了一個更好的服務器端解決方案。 – 2009-10-16 20:36:24

+0

@Peter,我完全同意,但我正在處理工作流程,所以後退按鈕不適用於此。 – mkoryak 2009-10-19 02:19:53

回答

9

嗯,默認情況下,當你處理表單POST時,然後用戶回來然後刷新,然後他們會看到消息表明瀏覽器正在重新提交數據。但是,如果頁面被設置爲立即過期,那麼他們甚至不需要進行刷新,並且他們會在返回時看到頁面已過期的消息。

爲了避免兩個消息有幾件事情要嘗試:

1)使用的一種形式,而不是GET。這取決於你在做什麼,但這並不總是一個好的解決方案,因爲GET請求仍然有大小限制。信息在查詢字符串中傳遞,這不是最安全的選項。

- 或 -

2)執行服務器端重定向到一個不同的頁的形式POST之後。

看起來像一個類似的問題在這裏回答:

Redirect with a 303 after POST to avoid "Webpage has expired": Will it work if there are more bytes than a GET request can handle?

作爲第三種選擇一個可以防止用戶在他們的瀏覽器回去的。唯一一次我覺得有必要這樣做是爲了防止他們做一些愚蠢的事情,比如支付兩次。雖然有更好的服務器端方法來處理。如果您的網站使用會話,那麼您可以通過首先禁用結帳頁面上的緩存並將其設置爲立即過期來阻止他們付費兩次。然後,您可以利用存儲在會話中的某種標誌,如果您回頭瞭解,它實際上會改變頁面的行爲。

2

你需要在HTTP頭設置編譯緩存控制選項: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9

然而,從可用性的角度來看,這是不鼓勵的做法此事。我強烈建議你去尋找其他的選擇。

ps:正如Steve提議的那樣,通過GET重定向是正確的方式(或者用JS檢查頁面移動)。

0

我不確定這是否是標準做法,但我通常不通過僅爲IE發送Vary標頭來解決此問題。在Apache中,就可以把在httpd.conf以下:

BrowserMatch MSIE force-no-vary 

按照RFC

的因人而異字段值指示充分 確定請求頭字段的集合 ,而響應爲 新鮮,是否允許高速緩存爲 使用響應來回復 後續請求而不使用 重新驗證。

實際效果是,當你回到POST時,IE只是從歷史緩存中獲取頁面。根本沒有請求去服務器端。我可以在HTTPWatch中清楚地看到這一點。

我會很有興趣聽到這種方法的潛在不良副作用。

1

嘗試使用下面的代碼在Page_Load

Response.Cache.SetCacheability(HttpCacheability.Private) 
+0

這是.net特定的權利? – mkoryak 2011-03-26 00:56:55

+0

是的,據我所知 – Jeremy 2011-04-11 11:47:50

1

使用下列前session_start之一:

session_cache_expire(60); // in minutes 

ini_set('session.cache_limiter', 'private'); 

/注:

語言是PHP

+0

包括這是什麼語言會有幫助 – mkoryak 2012-02-15 16:17:51