asp.net 防止用戶通過后退按鈕重復(fù)提交表單
更新時(shí)間:2009年11月12日 22:49:45 作者:
經(jīng)過一番仔細(xì)的尋尋覓覓之后,我發(fā)現(xiàn)仍舊無法找出真正能夠完全禁用瀏覽器后退按鈕的辦法。所有這里介紹的方法都能夠在不同程度上、以不同的方式禁止用戶返回前一頁面,但它們都有各自的局限。
防止用戶通過后退按鈕重復(fù)提交表單
<%
response.Buffer=true
response.Expires=0
response.ExpiresAbsolute=now()-1
response.CacheControl="no-cache"
%>
response.Buffer=true的意思就是指明輸出頁面是否被緩沖,當(dāng)屬性值為True時(shí),服務(wù)器將不會向客戶端發(fā)送任何信息,直到所有程序執(zhí)行完或者遇到
<% Response.Flush %>或<% Response.End %>
語句,才會釋放緩沖區(qū)的信息。
Expires 屬性
Expires 屬性指定了在瀏覽器上緩沖存儲的頁距過期還有多少時(shí)間。如果用戶在某個頁過期之前又回到此頁,就會顯示緩沖區(qū)中的版本
語法
Response.Expires [= number]
參數(shù)
number
距過期還有多少分鐘。將此參數(shù)設(shè)置為 0 可使緩存的頁立即過期。
注釋
若此屬性在一頁上設(shè)置了多次,則使用最短的時(shí)間。
應(yīng)用于
Response 對象
Response.expires=0也表示立即過期,但如果client和server不在一個時(shí)區(qū)或者client的時(shí)間早于server上的時(shí)間,則不能立即過期。所以用負(fù)數(shù)或者用Response.ExpiresAbsolute=now()-1來表示立即過期,response.expires=1表示在1分鐘后過期。
asp中Response.ExpiresAbsolute=now()-1
在asp頁面中,通常會有這樣的設(shè)置。
Response.ExpiresAbsolute=now()-1‘設(shè)置過期時(shí)間的絕對值為當(dāng)前時(shí)間-1,即出來后就過期了
這是因?yàn)槟J(rèn)情況下,瀏覽器將頁面先載入緩存,然后才顯示出來.通過上述設(shè)置,使瀏覽器對頁面不進(jìn)行緩存,所以當(dāng)用戶點(diǎn)"后退"后,由于頁面沒有緩存,所以瀏覽器只能再次通過向服務(wù)器發(fā)出HTTP請求來得到頁面,這樣就實(shí)現(xiàn)了限制了用戶對同一網(wǎng)頁進(jìn)行多次操作。
asp中Response.Expires = -1
一般情況下,當(dāng)用戶請求WEB服務(wù)器時(shí),服務(wù)器把請求回復(fù)給客戶端。在客戶端,瀏覽器把緩存作為一種加快速度的策略,就是當(dāng)請求時(shí)先檢查緩存的情況,如果有就直接調(diào)緩存了,而不請求服務(wù)器了。
在WEB程序設(shè)計(jì)中,有時(shí)為了防止重復(fù)的提交或者嚴(yán)格的次序等,必須讓用戶的數(shù)據(jù)立即在使用后就過期,當(dāng)用戶后退時(shí)就顯示過期而不能繼續(xù)使用。也算是為安全考慮的吧。
一般,response.expires寫在頁面的最上端,后面跟的是一個時(shí)間,就是過期的時(shí)間,0表示立即過期。
asp中對瀏覽器緩存的設(shè)置
Response.CacheControl = "no-cache"
設(shè)置不緩存在臨時(shí)文件中.本句是指,上網(wǎng)時(shí)看到的圖片通常在internet的
接下來我們要討論的方法以后退按鈕本身為中心,而不是瀏覽器緩存。這兒有一篇文章Rewiring the Back Button很值得參考。不過我注意到,如果使用這種方法,雖然用戶點(diǎn)擊一下后退按鈕時(shí)他不會看到以前輸入數(shù)據(jù)的頁面,但只要點(diǎn)擊兩次就可以,這可不是我們希望的
效果,因?yàn)楹芏鄷r(shí)候,固執(zhí)的用戶總是能夠找到繞過預(yù)防措施的辦法。
另外一種禁用后退按鈕的辦法是用客戶端javascript打開一個沒有工具條的窗口,這使得用戶很難返回前一頁面,但不是不可能。一種更安全但相當(dāng)惱人的方法是,當(dāng)表單提交時(shí)打開一個新的窗口,與此同時(shí)關(guān)閉表單所在的窗口。但我覺得這種方法不值得認(rèn)真考慮,因?yàn)槲?
們總不能讓用戶每提交一個表單就打開一個新窗口。
那么,在那個我們不想讓用戶返回的頁面是否也可以加入javascript代碼呢?在這個頁面中加入的javascript代碼可用來產(chǎn)生點(diǎn)擊前進(jìn)按鈕的效果,這樣也就抵消了用戶點(diǎn)擊后退按鈕所產(chǎn)生的動作。用于實(shí)現(xiàn)該功能的javascript代碼如下所示:
<script language="javascript">
<!--
javascript:window.history.forward(1);
//-->
</script>
同樣地,這種方法雖然有效,但距離“最好的方法”還差得很遠(yuǎn)。后來我又看到有人建議用location.replace從一個頁面轉(zhuǎn)到另一個頁面。這種方法的原理是,用新頁面的URL替換當(dāng)前的歷史紀(jì)錄,這樣瀏覽歷史記錄中就只有一個頁面,后退按鈕永遠(yuǎn)不會變?yōu)榭捎谩N蚁脒@可能正是許多人所尋求的方法,但這種方法仍舊不是任何情況下的最好方法。使用這種方法的實(shí)例如下所示:
<A HREF="PageName.htm" onclick="javascript:location.replace(this.href); event.returnvalue=false; ">
禁止后退到本頁面的鏈接
試試下面這個鏈接:
禁止后退到本頁面的鏈接!
這種方法的缺點(diǎn)在于:簡單地運(yùn)用Response.Redirect將不再有效,這是因?yàn)槊看斡脩魪囊粋€頁面轉(zhuǎn)到另一個頁面,我們都必須用客戶端代碼清除 location.history。另外還要注意,這種方法清除的是最后一個訪問歷史記錄,而不是全部的訪問記錄。
點(diǎn)擊上面的鏈接,你將打開一個簡單的HTML頁面。再點(diǎn)擊后退按鈕,你可以看到這時(shí)打開的不是本頁面,而是本頁面之前的頁面?。ó?dāng)然,你必須在瀏覽器中啟用了客戶端javascript代碼。)
經(jīng)過一番仔細(xì)的尋尋覓覓之后,我發(fā)現(xiàn)仍舊無法找出真正能夠完全禁用瀏覽器后退按鈕的辦法。所有這里介紹的方法都能夠在不同程度上、以不同的方式禁止用戶返回前一頁面,但它們都有各自的局限。由于不存在能夠完全禁用后退按鈕的方法,所以最好的方案應(yīng)該是:混合運(yùn)用客戶端腳本和服務(wù)器端腳本。
<%
response.Buffer=true
response.Expires=0
response.ExpiresAbsolute=now()-1
response.CacheControl="no-cache"
%>
response.Buffer=true的意思就是指明輸出頁面是否被緩沖,當(dāng)屬性值為True時(shí),服務(wù)器將不會向客戶端發(fā)送任何信息,直到所有程序執(zhí)行完或者遇到
<% Response.Flush %>或<% Response.End %>
語句,才會釋放緩沖區(qū)的信息。
Expires 屬性
Expires 屬性指定了在瀏覽器上緩沖存儲的頁距過期還有多少時(shí)間。如果用戶在某個頁過期之前又回到此頁,就會顯示緩沖區(qū)中的版本
語法
Response.Expires [= number]
參數(shù)
number
距過期還有多少分鐘。將此參數(shù)設(shè)置為 0 可使緩存的頁立即過期。
注釋
若此屬性在一頁上設(shè)置了多次,則使用最短的時(shí)間。
應(yīng)用于
Response 對象
Response.expires=0也表示立即過期,但如果client和server不在一個時(shí)區(qū)或者client的時(shí)間早于server上的時(shí)間,則不能立即過期。所以用負(fù)數(shù)或者用Response.ExpiresAbsolute=now()-1來表示立即過期,response.expires=1表示在1分鐘后過期。
asp中Response.ExpiresAbsolute=now()-1
在asp頁面中,通常會有這樣的設(shè)置。
Response.ExpiresAbsolute=now()-1‘設(shè)置過期時(shí)間的絕對值為當(dāng)前時(shí)間-1,即出來后就過期了
這是因?yàn)槟J(rèn)情況下,瀏覽器將頁面先載入緩存,然后才顯示出來.通過上述設(shè)置,使瀏覽器對頁面不進(jìn)行緩存,所以當(dāng)用戶點(diǎn)"后退"后,由于頁面沒有緩存,所以瀏覽器只能再次通過向服務(wù)器發(fā)出HTTP請求來得到頁面,這樣就實(shí)現(xiàn)了限制了用戶對同一網(wǎng)頁進(jìn)行多次操作。
asp中Response.Expires = -1
一般情況下,當(dāng)用戶請求WEB服務(wù)器時(shí),服務(wù)器把請求回復(fù)給客戶端。在客戶端,瀏覽器把緩存作為一種加快速度的策略,就是當(dāng)請求時(shí)先檢查緩存的情況,如果有就直接調(diào)緩存了,而不請求服務(wù)器了。
在WEB程序設(shè)計(jì)中,有時(shí)為了防止重復(fù)的提交或者嚴(yán)格的次序等,必須讓用戶的數(shù)據(jù)立即在使用后就過期,當(dāng)用戶后退時(shí)就顯示過期而不能繼續(xù)使用。也算是為安全考慮的吧。
一般,response.expires寫在頁面的最上端,后面跟的是一個時(shí)間,就是過期的時(shí)間,0表示立即過期。
asp中對瀏覽器緩存的設(shè)置
Response.CacheControl = "no-cache"
設(shè)置不緩存在臨時(shí)文件中.本句是指,上網(wǎng)時(shí)看到的圖片通常在internet的
接下來我們要討論的方法以后退按鈕本身為中心,而不是瀏覽器緩存。這兒有一篇文章Rewiring the Back Button很值得參考。不過我注意到,如果使用這種方法,雖然用戶點(diǎn)擊一下后退按鈕時(shí)他不會看到以前輸入數(shù)據(jù)的頁面,但只要點(diǎn)擊兩次就可以,這可不是我們希望的
效果,因?yàn)楹芏鄷r(shí)候,固執(zhí)的用戶總是能夠找到繞過預(yù)防措施的辦法。
另外一種禁用后退按鈕的辦法是用客戶端javascript打開一個沒有工具條的窗口,這使得用戶很難返回前一頁面,但不是不可能。一種更安全但相當(dāng)惱人的方法是,當(dāng)表單提交時(shí)打開一個新的窗口,與此同時(shí)關(guān)閉表單所在的窗口。但我覺得這種方法不值得認(rèn)真考慮,因?yàn)槲?
們總不能讓用戶每提交一個表單就打開一個新窗口。
那么,在那個我們不想讓用戶返回的頁面是否也可以加入javascript代碼呢?在這個頁面中加入的javascript代碼可用來產(chǎn)生點(diǎn)擊前進(jìn)按鈕的效果,這樣也就抵消了用戶點(diǎn)擊后退按鈕所產(chǎn)生的動作。用于實(shí)現(xiàn)該功能的javascript代碼如下所示:
<script language="javascript">
<!--
javascript:window.history.forward(1);
//-->
</script>
同樣地,這種方法雖然有效,但距離“最好的方法”還差得很遠(yuǎn)。后來我又看到有人建議用location.replace從一個頁面轉(zhuǎn)到另一個頁面。這種方法的原理是,用新頁面的URL替換當(dāng)前的歷史紀(jì)錄,這樣瀏覽歷史記錄中就只有一個頁面,后退按鈕永遠(yuǎn)不會變?yōu)榭捎谩N蚁脒@可能正是許多人所尋求的方法,但這種方法仍舊不是任何情況下的最好方法。使用這種方法的實(shí)例如下所示:
<A HREF="PageName.htm" onclick="javascript:location.replace(this.href); event.returnvalue=false; ">
禁止后退到本頁面的鏈接
試試下面這個鏈接:
禁止后退到本頁面的鏈接!
這種方法的缺點(diǎn)在于:簡單地運(yùn)用Response.Redirect將不再有效,這是因?yàn)槊看斡脩魪囊粋€頁面轉(zhuǎn)到另一個頁面,我們都必須用客戶端代碼清除 location.history。另外還要注意,這種方法清除的是最后一個訪問歷史記錄,而不是全部的訪問記錄。
點(diǎn)擊上面的鏈接,你將打開一個簡單的HTML頁面。再點(diǎn)擊后退按鈕,你可以看到這時(shí)打開的不是本頁面,而是本頁面之前的頁面?。ó?dāng)然,你必須在瀏覽器中啟用了客戶端javascript代碼。)
經(jīng)過一番仔細(xì)的尋尋覓覓之后,我發(fā)現(xiàn)仍舊無法找出真正能夠完全禁用瀏覽器后退按鈕的辦法。所有這里介紹的方法都能夠在不同程度上、以不同的方式禁止用戶返回前一頁面,但它們都有各自的局限。由于不存在能夠完全禁用后退按鈕的方法,所以最好的方案應(yīng)該是:混合運(yùn)用客戶端腳本和服務(wù)器端腳本。
您可能感興趣的文章:
- asp.net獲取HTML表單File中的路徑的方法
- asp.net 中將表單提交到另一頁 Code-Behind(代碼和html在不同的頁面)
- asp.net利用后臺實(shí)現(xiàn)直接生成html分頁的方法
- Asp.net動態(tài)生成html頁面的方法分享
- 使用ASP.NET模板生成HTML靜態(tài)頁面的五種方案
- jquery獲取ASP.NET服務(wù)器端控件dropdownlist和radiobuttonlist生成客戶端HTML標(biāo)簽后的value和text值
- ASP.net(c#) 生成html的幾種解決方案[思路]
- 使用ASP.NET 2.0 CSS 控件適配器生成CSS友好的HTML輸出
- asp.net生成HTML
- 利用ASP.NET技術(shù)動態(tài)生成HTML頁面
- asp.net 模擬提交有文件上傳的表單(通過http模擬上傳文件)
- ASP.NET中實(shí)現(xiàn)把form表單元素轉(zhuǎn)為實(shí)體對象或集合
- asp.net動態(tài)生成HTML表單的方法
相關(guān)文章
Centos7+Docker+Jenkins+ASP.NET Core 2.0自動化發(fā)布與部署的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于Centos7+Docker+Jenkins+ASP.NET Core 2.0自動化發(fā)布與部署的相關(guān)資料,文中通過示例代碼及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-05-05asp.net C#實(shí)現(xiàn)解壓縮文件的方法
這篇文章主要介紹了asp.net C#實(shí)現(xiàn)解壓縮文件的方法,分別講述了三種不同的實(shí)現(xiàn)方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11asp.net中不能在DropDownList中選擇多個項(xiàng) 原因分析及解決方法
不能在 DropDownList 中選擇多個項(xiàng),在前一步操作的過程中,已經(jīng)選擇了某個Item2012-10-10解讀ASP.NET密碼強(qiáng)度驗(yàn)證代碼實(shí)例分享
這篇文章介紹了ASP.NET密碼強(qiáng)度驗(yàn)證代碼實(shí)例,有需要的朋友可以參考一下2013-10-10對GridView的行加顏色并彈出Kindeditor的實(shí)現(xiàn)思路
本文主要詳細(xì)介紹下對GridView的行加顏色并彈出Kindeditor,感興趣的朋友可以了解下,希望可以幫助到你2013-04-04詳解Asp.net web.config customErrors 如何設(shè)置
這篇文章主要介紹了詳解Asp.net web.config customErrors 如何設(shè)置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02如何傳值在2個頁面之間 要求不刷新父頁面,并且不能用Querystring傳值
通過Cookie,因?yàn)樗瓤梢栽诜?wù)器端對其進(jìn)行操作,也可在客戶端對其進(jìn)行操作但是缺點(diǎn)是不安全,而且有時(shí)客戶端會由于安全問題禁用Cookie!2008-12-12