2013年12月25日 星期三

[ASP.NET C#] 禁止回到上一頁,網頁過期

Reference:http://rely1020.blog.ithome.com.tw/post/1606/60106

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 的畫面。並繼續工作。

沒有留言:

張貼留言