2008-11-16 23 views

回答

2

如果您爲每個鏈接提供URL中唯一的ID(例如GUID)作爲參數,則可以跟蹤所有請求你已經處理完畢。 (如果你不介意這個機制不工作,如果有人讓瀏覽器打開幾天然後刷新刷新,你可以清除「舊」請求。)當你第一次看到一個GUID時,把它寫入表中。如果再次看到它,請重定向到錯誤頁面。

雖然這很醜,用戶可以編輯URL來稍微改變GUID。 (您可以通過記錄GUID當你生成它解決這最後的漏洞,並更新表指示何時它已經使用

一般情況下,用戶希望能夠刷新頁面,但 - 特別是對於GET請求(即使大多數用戶不知道這意味着什麼)。你爲什麼想這樣做?

-2

你可以使用客戶端隱藏變量來存儲計數器,或者你可以把計數器放在會話中。那麼我會建議你刷新頁面過期有辦法可以實現這個禁用緩存等[像所有銀行網站一樣]。

0

你可以這樣做,但我相信你不應該這樣做。用戶控制着瀏覽器,如果她覺得自己很爽快,那麼你的工作就是確保頁面刷新。返回錯誤頁面是錯誤的答案。

1

那麼,你可以使用一個非常有名的技術叫做「Syncronizing Token」或類似的東西= D,主要用於發送表單。

這會像這樣:

  1. 創建一個函數來提供一個僞隨機字符串標記。

  2. 對於您的每個請求頁面,請檢查Session中是否存在變量,例如:Session [「synctoken」](如果存在)。如果不是,那麼這是第一次生成令牌並將其存儲在那裏。

  3. 每個鏈接請求,例如:「mypage.aspx」將一個名爲synctoken的get與另一個標記放在一起,與您在Session中存儲的標記不同,它會像「mypage.aspx?synctoken = 2iO02-3S23d」 。 (Request.QueryString [「synctoken」]!= null)。然後,回到(2),在請求中,如果令牌存在於會話中,則檢查是否存在GET(Request.QueryString [「synctoken」]!= null)。如果否,則發送錯誤。如果是,請檢查令牌(會話和GET)是否不同。如果它們不同,則可以將GET存儲到Session(Session [「synctoken」] = Request.QueryString [「synctoken」])並轉到步驟(2)。如果不是,那麼用戶刷新頁面,出現錯誤。

它是這樣:

if (Session["synctoken"] != null) { 
    if (Request.QueryString["synctoken"] != null) { 
     if (Request.QueryString["synctoken"].ToString().Equals(Session["synctoken"].ToString())) { 
      // Refresh! Goto Error! 
      MyUtil.GotoError(); 
     } 
     else { 
      // It is ok, store the token and go on! 
      Session["synctoken"] = Request.QueryString["synctoken"]; 
     } 
    } 
    else { 
     MyUtil.GotoErrorPage(); 
    } 
} 
else { 
    Session["synctoken"] = MyUtil.GenerateToken(); 
} 

很抱歉,如果我不能更清楚..祝你好運!

+0

好的,得到了​​一個減號,但我甚至不知道爲什麼!很抱歉幫忙。 – 2008-11-16 15:00:34

相關問題