防止使用者通過後退按鈕重複提交表單
<%
response.Buffer=true
response.Expires=0
response.ExpiresAbsolute=now()-1
response.CacheControl="no-cache"
%>
response.Buffer=true的意思就是指明輸出頁面是否被緩衝,當屬性值為True時,伺服器將不會向用戶端發送任何資訊,直到所有程式執行完或者遇到
<% Response.Flush %>或<% Response.End %>
語句,才會釋放緩衝區的資訊。
Expires 屬性
Expires 屬性指定了在瀏覽器上緩衝儲存的頁距到期還有多少時間。如果使用者在某個頁到期之前又回到此頁,就會顯示緩衝區中的版本
文法
Response.Expires [= number]
參數
number
距到期還有多少分鐘。將此參數設定為 0 可使緩衝的頁立即到期。
注釋
若此屬性在一頁上設定了多次,則使用最短的時間。
應用於
Response 對象
Response.expires=0也表示立即到期,但如果client和server不在一個時區或者client的時間早於server上的時間,則不能立即到期。所以用負數或者用Response.ExpiresAbsolute=now()-1來表示立即到期,response.expires=1表示在1分鐘後到期。
asp中Response.ExpiresAbsolute=now()-1
在asp頁面中,通常會有這樣的設定。
Response.ExpiresAbsolute=now()-1‘設定到期時間的絕對值為目前時間-1,即出來後就到期了
這是因為預設情況下,瀏覽器將頁面先載入緩衝,然後才顯示出來.通過上述設定,使瀏覽器對頁面不進行緩衝,所以當使用者點"後退"後,由於頁面沒有緩衝,所以瀏覽器只能再次通過向伺服器發出HTTP請求來得到頁面,這樣就實現了限制了使用者對同一網頁進行多次操作。
asp中Response.Expires = -1
一般情況下,當使用者請求WEB伺服器時,伺服器把請求回複給用戶端。在用戶端,瀏覽器把緩衝作為一種加快速度的策略,就是當請求時先檢查緩衝的情況,如果有就直接調緩衝了,而不請求伺服器了。
在WEB程式設計中,有時為了防止重複的提交或者嚴格的次序等,必須讓使用者的資料立即在使用後就到期,當使用者後退時就顯示到期而不能繼續使用。也算是為安全考慮的吧。
一般,response.expires寫在頁面的最上端,後面跟的是一個時間,就是到期的時間,0表示立即到期。
asp中對瀏覽器緩衝的設定
Response.CacheControl = "no-cache"
設定不緩衝在臨時檔案中.本句是指,上網時看到的圖片通常在internet的
接下來我們要討論的方法以後退按鈕本身為中心,而不是瀏覽器緩衝。這兒有一篇文章Rewiring the Back Button很值得參考。不過我注意到,如果使用這種方法,雖然使用者點擊一下後退按鈕時他不會看到以前輸入資料的頁面,但只要點擊兩次就可以,這可不是我們希望的
效果,因為很多時候,固執的使用者總是能夠找到繞過預防措施的辦法。
另外一種禁用後退按鈕的辦法是用用戶端javascript開啟一個沒有工具條的視窗,這使得使用者很難返回前一頁面,但不是不可能。一種更安全但相當惱人的方法是,當表單提交時開啟一個新的視窗,與此同時關閉表單所在的視窗。但我覺得這種方法不值得認真考慮,因為我
們總不能讓使用者每提交一個表單就開啟一個新視窗。
那麼,在那個我們不想讓使用者返回的頁面是否也可以加入javascript代碼呢?在這個頁面中加入的javascript代碼可用來產生點擊前進按鈕的效果,這樣也就抵消了使用者點擊後退按鈕所產生的動作。用於實現該功能的javascript代碼如下所示:
<script language="javascript">
<!--
javascript:window.history.forward(1);
//-->
</script>
同樣地,這種方法雖然有效,但距離“最好的方法”還差得很遠。後來我又看到有人建議用location.replace從一個頁面轉到另一個頁面。這種方法的原理是,用新頁面的URL替換當前的曆史紀錄,這樣瀏覽歷程記錄中就只有一個頁面,後退按鈕永遠不會變為可用。我想這可能正是許多人所尋求的方法,但這種方法仍舊不是任何情況下的最好方法。使用這種方法的執行個體如下所示:
<A HREF="PageName.htm" onclick="javascript:location.replace(this.href); event.returnvalue=false; ">
禁止後退到本頁面的連結
試試下面這個連結:
禁止後退到本頁面的連結!
這種方法的缺點在於:簡單地運用Response.Redirect將不再有效,這是因為每次使用者從一個頁面轉到另一個頁面,我們都必須用用戶端代碼清除 location.history。另外還要注意,這種方法清除的是最後一個訪問記錄,而不是全部的訪問記錄。
點擊上面的連結,你將開啟一個簡單的HTML頁面。再點擊後退按鈕,你可以看到這時開啟的不是本頁面,而是本頁面之前的頁面!(當然,你必須在瀏覽器中啟用了用戶端javascript代碼。)
經過一番仔細的尋尋覓覓之後,我發現仍舊無法找出真正能夠完全禁用瀏覽器後退按鈕的辦法。所有這裡介紹的方法都能夠在不同程度上、以不同的方式禁止使用者返回前一頁面,但它們都有各自的局限。由於不存在能夠完全禁用後退按鈕的方法,所以最好的方案應該是:混合運用用戶端指令碼和伺服器端指令碼。