This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.

取之於網路用之於網路-只寫程式 會員登入 會員註冊

« 上一篇 | 下一篇 »

1.源由

本人在工作上剛好又遇到此問題,
Browser的「上一頁」讓同樣的資料處理了多次。
就把處理方式記下來吧。

問題情境如下:

  • 假設有兩個WebPage:
    WebPageA_DoJob 處理資料,有敏感性的資料,如:錢、帳號等。
    WebPageB_Done 顯示完成訊息。
  • 出問題的執行情境如下:
    1. 執行到WebPageA_DoJob,並填好資料。
    2. WebPageA_DoJob.submit 進到 WebPageB_Done。
    3. WebPageB_Done 按「上一頁」。
    4. WebPageA_DoJob.submit 再跑了一次。
    5. 完蛋,同樣的資料處理做了兩次。要是轉帳程式的話,就準備拜拜吧。

問題很明顯的就出在Browser的「上一頁」功能。

2.目的, spec. statement.

首先先了解問題的根源,其問題情境如下:

  • 假設有兩個WebPage:
    • WebPageA_DoJob 處理資料,有敏感性的資料,如:錢、帳號等。
    • WebPageB_Done 顯示完成訊息。
  • 出問題的執行情境如下:
    1. 執行到WebPageA_DoJob,並填好資料。
    2. WebPageA_DoJob.submit 進到 WebPageB_Done。
    3. WebPageB_Done 按「上一頁」。
    4. WebPageA_DoJob.submit 再跑了一次。
    5. 完蛋,同樣的資料處理做了兩次。要是轉帳程式的話,就準備拜拜吧。

問題很明顯的就出在Browser的「上一頁」功能。
處理的方式就是把Browser的「上一頁」功能無效化。

3.解法, solution

先了解一下Brower「上一頁」的原理,
Browser「上一頁」是一種Cache機制,將WebPage暫存在Browser端,以省下loading的時間。
若只是瀏覽Web,「上一頁」機制是很讚的。可處理敏感性資料就頭痛了。

解法就是把該Cache關掉就行了。

在Web上找來找去,找到答案了。
參考資料:
MSDN論譠-問卷系統,填過的問題,就算回「上一頁」也無效 http://social.msdn.microsoft.com/forums/zh-TW/236/thread/683f4847-4372-491d-b6d8-a665c39779b9/?prof=required

把解留下:
在Page_Load()加上這一行指令要求Browser在此Page不留Cache。
Response.Cache.SetCacheability(HttpCacheability.NoCache);
此指令取代以前的 Response.Expires 和 Response.CacheControl 兩個功能用。

4.原碼

下面是本人實戰原碼。

 

protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
//# 設定此頁面不留Cache,讓上一頁無法回來。
Response.Cache.SetCacheability(HttpCacheability.NoCache);
//## 初始化畫面。
......
}
}

 

下面是本人的應用情境說明:

  • 首先設定好
    1. WebPageA_DoJob: 加上NoCache設定。把處理資料的WebPage設定NoCache。
    2. WebPageB_Done : 未設NoCache。
  • 執行效果:
    • 執行到WebPageA_DoJob,並填好資料。
    • WebPageA_DoJob.submit 進到 WebPageB_Done。
    • WebPageB_Done 按「上一頁」。
    • WebPageA_DoJob 變成「網頁已過期」。
    • 此時用「下一頁」還是可以回到原 WebPageB_Done 的畫面。並繼續工作。
  1. 亞特蘭提斯 Re: 讓Browser的「上一頁」無效(網頁已過期) [回覆]

    用AJAX可能會比較快!

    亞特蘭提斯 回應於 29 十一月, 2009 02:13

      Re: Re: 讓Browser的「上一頁」無效(網頁已過期) [回覆]

      以我的應用來說,PageA做事情,PageB顯示完成訊息,有換頁的設計目的是讓畫面不要太雜且流程更順暢。
      且使用Ajax技術也控制不了Browser的「上一頁」。

      Rely 回應於 01 十二月, 2009 23:30

  2. Re: 讓Browser的「上一頁」無效(網頁已過期) [回覆]

    我觉用AJAX比较快

    Replica Sunglasses 回應於 21 八月, 2010 14:10