本篇文章主要介紹了網頁如何防止重新整理重複提交與如何防止後退的解決方案,具體如下:
提交後禁用提交按鈕(大部分人都是這樣做的)
如果客戶提交後,按F5重新整理怎麼辦?
使用Session
在提交的頁面也就是資料庫處理之前:
if session("ok")=true then response.write "錯誤,正在提交" response.endend if
資料處理完後,修改session("ok")=false。
資料處理成功馬上Redirect到另外一個頁面
操作後重新整理的確是個問題,你可以使用跳轉頁面、關閉本頁面,如果是有參資料條件來控制的,那就應該好做了,可以直接修改window.location的值,把參數全部改掉,這樣就差不多了。
缺點:簡單地運用Response.Redirect將不再有效,因為使用者從一個頁面轉到另一個頁面,我們都必須用用戶端代碼清除location.history。注意,這種方法清除的是最後一個訪問記錄,而不是全部的訪問記錄。 點擊後退按鈕,再點擊後退按鈕,你可以看到這時開啟的是本頁面之前的頁面!(當然,這是在你的用戶端啟用了JavaScript功能的條件下。)
如果客戶按後退,怎麼辦?
防止網頁後退--禁止緩衝
我們在進行資料庫添加操作的時候,如果允許後退,而正巧有重新整理了頁面,就會再次執行添加操作,無疑這不是我們需要的,像一般網上很多禁止緩衝的代碼,有時並不可靠,這時你只要在操作的頁面加上就可以了,在網頁的裡指定要定向的新頁,再點後退,看是不是不會再退到剛才的操作頁面了,實際上已經把這個曆史給刪除了
ASP:
Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache"
ASP.NET:
Response.Buffer=true;Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1);Response.Expires=0;Response.CacheControl="no-cache";
究竟怎樣才能"禁用"瀏覽器的後退按鈕?或者“怎樣才能防止使用者點擊後退按鈕返回以前瀏覽過的頁面?”
遺憾的是,我們無法禁用瀏覽器的後退按鈕。
防止網頁後退--新開視窗
用window.open彈出表單頁面,點提交後關閉該頁;處理提交的ASP頁也是用彈出,設定表單的target,點提交時window.open("XXX.asp","_blank"),然後用JS來提交表單,完成後window.close();
簡單的說,就是提交表單的時候彈出新視窗,關閉本視窗。對於window.open()開啟的視窗怎麼後退?能後退到哪裡去?
呵呵,羅嗦了一堆廢話,知道怎麼處理了嗎?混合運用用戶端指令碼和伺服器端指令碼。
jsp重複提交問題
看了網上的,有幾種方法:
1 在你的表單頁裡HEAD區加入這段代碼:
<META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
2 產生一個令牌儲存在使用者session中,在form中加一個hidden域,顯示該令牌的值,form提交後重建一個新的令牌,將使用者提交的令牌和session 中的令牌比較,如相同則是重複提交
3 在你的伺服器端控制項的代碼中使用Response.Redirect("selfPage")語句。但是大多的數都不使用這種方法。
方法還有很多。。。
4 、
<input type="button" value="提交" onclick="this.disabled=true;this.form.submit()">
5 在JSP頁面的FORM表單中添加一個hidden域
<input type="hidden" name="url"value=<%=request.getRequestURL()%>>
在你的serverlet(Java代碼)中添加如下語句
String url=request.getParameter("url"); response.sendRedirect(url);
我一般都是採用這樣的方法返回JSP頁面的,不太明白你說的重複重新整理是什麼概念
6 ajax 無重新整理提交
7 Web開發中防止瀏覽器的重新整理鍵引起系統操作重複提交
怎麼解決呢?重新導向可以解決頁面重新整理帶來的資料的重複提交的問題,我們自然可以利用重新導向的方式來解決這個問題。但是struts的action裡面mapping.findword();跳轉的話,預設的是在工程檔案夾裡面找要跳轉的頁面。這種情況,怎麼解決呢?
修改struts-config.xml 檔案, 在action裡面有一個redirect重新定向的屬性,struts中預設的是false,添加這個屬性,改成true,在forword中寫上要跳轉頁面的絕對或者相對位址就行了
修改如下:
<action-mappings><action attribute="newsActionForm" name="newsActionForm" input="/addnews.jsp" path="/newsAction" parameter="method" scope="request" type="com.yongtree.news.action.NewsAction"> <forward name="list" path="/listnews.jsp" redirect="true"></forward> <forward name="error" path="/addnews.jsp"></forward></action></action-mappings>
瀏覽器相關難處理的問題
瀏覽器的後退按鈕使得我們能夠方便地返回以前訪問過的頁面,它無疑非常有用。但有時候我們不得不關閉這個功能,以防止使用者打亂預定的頁面訪問次序。本文介紹網路上可找到的各種禁用瀏覽器後退按鈕方案,分析它們各自的優缺點和適用場合。
一、概述
曾經有許多人問起,“怎樣才能‘禁用'瀏覽器的後退按鈕?”,或者“怎樣才能防止使用者點擊後退按鈕返回以前瀏覽過的頁面?”在ASP論壇上,這個問題也是問得最多的問題之一。遺憾的是,答案非常簡單:我們無法禁用瀏覽器的後退按鈕。
起先我對於居然有人想要禁用瀏覽器的後退按鈕感到不可思議。後來,看到竟然有那麼多的人想要禁用這個後退按鈕,我也就釋然(想要禁用的只有後退按鈕,不包括瀏覽器的前進按鈕)。因為在預設情況下,使用者提交表單之後可以通過後退按鈕返回表單頁面(而不是使用“編輯”按鈕!),然後再次編輯並提交表單向資料庫插入新的記錄。這是我們不願看到的。
因此我就決定要找出避免出現這種情況的方法。我訪問了許多網站,參考了這些網站所介紹的各種實現方法。如果你經常訪問ASP編程網站,本文所介紹的部分內容你可能已經見到過。本文的任務是把各種可能的方法都介紹給大家,然後找出最好的方法!
二、禁止緩衝
在我找到的許多方案中,其中有一種建議禁止頁面緩衝。具體是使用伺服器端指令碼,如下所示:
<% Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache" %>
這種方法非常有效!它強制瀏覽器重新訪問伺服器下載頁面,而不是從緩衝讀取頁面。使用這種方法時,編程者的主要任務是建立一個會話級的變數,通過這個變數確定使用者是否仍舊可以查看那個不適合通過後退按鈕訪問的頁面。由於瀏覽器不再緩衝這個頁面,當使用者點擊後退按鈕時瀏覽器將重新下載該頁面,此時程式就可以檢查那個會話變數,看看是否應該允許使用者開啟這個頁面。
例如,假設我們有如下表單:
<% Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = "no-cache" If Len(Session("FirstTimeToPage")) > 0 then &single; 使用者已經訪問過當前頁面,現在是再次返回訪問。 &single; 清除會話變數,將使用者重新導向到登入頁面。 Session("FirstTimeToPage") = "" Response.Redirect "/Bar.asp" Response.End End If &single; 如果程式運行到這裡,說明使用者能夠查看當前頁面 &single; 以下開始建立表單 %> <form method=post action="SomePage.asp"> <input type=submit> </form>
我們藉助會話變數FirstTimeToPage檢查使用者是否是第一次訪問當前頁面。如果不是第一次(即Session("FirstTimeToPage")包含某個值),那麼我們就清除會話變數的值,然後把使用者重新定向到一個開始頁面。這樣,當表單提交時(此時SompePage.asp被開啟),我們必須賦予FirstTimeToPage一個值。即,在SomePage.asp中我們需要加上下面的代碼:
Session("FirstTimeToPage") = "NO"
這樣,已經開啟SomePage.asp的使用者如果點擊後退按鈕,瀏覽器將重新請求伺服器下載頁面,伺服器檢查到Session("FirstTimeToPage")包含了一個值,於是就清除Session("FirstTimeToPage"),並把使用者重新導向到其他頁面。當然,所有這一切都需要使用者啟用了Cookie,否則會話變數將是無效的。
另外,我們也可以用用戶端代碼使瀏覽器不再緩衝Web頁面:
<html> <head> <meta http-equiv="Expires" CONTENT="0"> <meta http-equiv="Cache-Control" CONTENT="no-cache"> <meta http-equiv="Pragma" CONTENT="no-cache"> </head>
如果使用上面的方法強制瀏覽器不再緩衝Web頁面,必須注意以下幾點:
只有在使用安全連線時“Pragma: no-cache”才防止瀏覽器快取頁面面。對於不受安全保護的頁面,“Pragma: no-cache”被視為與“Expires: -1”相同,此時瀏覽器仍舊快取頁面面,但把頁面標記為立即到期。在IE 4或5中,“Cache-Control”META HTTP-EQUIV標記將被忽略,不起作用。
在實際應用中我們可以加上所有這些代碼。然而,由於這種方法不能適用於所有的瀏覽器,所以是不推薦使用的。但如果是在Intranet環境下,管理員可以控制使用者使用哪種瀏覽器,我想還是有人會使用這種方法。
三、其他方法
接下來我們要討論的方法以後退按鈕本身為中心,而不是瀏覽器緩衝。這兒有一篇文章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;">禁止後退到本頁面的連結</A>
禁止後退到本頁面的連結!
這種方法的缺點在於:簡單地運用Response.Redirect將不再有效,這是因為每次使用者從一個頁面轉到另一個頁面,我們都必須用用戶端代碼清除location.history。另外還要注意,這種方法清除的是最後一個訪問記錄,而不是全部的訪問記錄。
點擊上面的連結,你將開啟一個簡單的HTML頁面。再點擊後退按鈕,你可以看到這時開啟的不是本頁面,而是本頁面之前的頁面!(當然,你必須在瀏覽器中啟用了用戶端JavaScript代碼。)
經過一番仔細的尋尋覓覓之後,我發現仍舊無法找出真正能夠完全禁用瀏覽器後退按鈕的辦法。所有這裡介紹的方法都能夠在不同程度上、以不同的方式禁止使用者返回前一頁面,但它們都有各自的局限。由於不存在能夠完全禁用後退按鈕的方法,所以最好的方案應該是:混合運用用戶端指令碼和伺服器端指令碼。
<html> <head> <meta http-equiv="Expires" CONTENT="0"> <meta http-equiv="Cache-Control" CONTENT="no-cache"> <meta http-equiv="Pragma" CONTENT="no-cache"> </head> <script language="JavaScript"> <!-- javascript:window.history.forward(1); //--> </script></html>
Asp.net中防重新整理重複提交、防後退方法
簡單操作方法防後退和重新整理
Page_Load中加入
Response.Cache.SetNoStore();//Session中儲存的變數“IsSubmit”是標記是否提交成功的 if (!IsPostBack)if (Session["IsSubmit"]==null)Session.Add("IsSubmit",false);if ((bool)Session["IsSubmit"]){//如果表單資料提交成功,就設“Session["IsSubmit"]”為falseSession["IsSubmit"] = false;//顯示提交成功資訊TextBox1.Text = " * 提交成功!";} else{//否則的話(沒有提交,或者是頁面重新整理),不顯示任何資訊TextBox1.Text = ""; Response.End();}
提交按鈕中加入
Session["IsSubmit"] = true;Response.Redirect ("本頁");
另外:
1、通常應該在業務層進行判斷(唯一性)解決這種問題
2、要在頁面裝載事件寫上 Response.CacheControl = "no-cache" 清除緩衝
3、也有人這樣說:我以前也碰到過這樣的問題,是在分步提交中一個人的簡曆,在寫完第一個頁面後跳到第二個頁面,為了防止使用者用後退返回到第一個頁面,再重新提交第一個頁面,我是當使用者提交第一次提交第一個頁面時,把插入資料庫中的記錄的自增長id號放到session裡,當使用者從第二個頁面返回到第一個頁面再一次提交該頁面時,我就用session裡的值去資料庫查,如果有這個id就用update語句把第一個頁面的資料寫進資料庫,如果沒有查到這個id,就用insert語句。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。