首頁 php教程 PHP开发 JSP防止網頁刷新重複提交資料的幾種方法

JSP防止網頁刷新重複提交資料的幾種方法

Dec 06, 2016 pm 01:52 PM
node

本篇文章主要介紹了網頁如何防止刷新重複提交與如何防止後退的解決方法,具體如下:

提交後禁用提交按鈕(大部分人都是這樣做的)

如果客戶提交後,按F5刷新怎麼辦?

使用Session

在提交的頁面也就是資料庫處理之前:

if session("ok")=true then
  response.write "错误,正在提交"
  response.end
end 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">
登入後複製

   

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()%>>
登入後複製

  Java

   

我一般都是採用這樣的方法返回JSP頁面的,不太明白你說的重複刷新是什麼概念 

6 ajax 無刷新提交

7 Web開發中防止瀏覽器的刷新鍵引起系統操作重複提交

怎麼解決呢?重定向可以解決頁面刷新帶來的資料的重複提交的問題,我們自然可以利用重定向的方式來解決這個問題。但struts的action裡面mapping.findword();跳轉的話,預設的是在工程資料夾裡面找要跳轉的頁面。這種情況,要怎麼解決呢?

修改struts-config.xml 文件, 在action裡面有一個redirect重新定向的屬性,struts中預設的是false,加入這個屬性,改成true,在forword中寫上要跳頁的絕對或相對地址就行了


修改如下:

   
String  url=request.getParameter("url"); 
response.sendRedirect(url);
登入後複製

   

瀏覽器相關難處理的問題

瀏覽器的後退按鈕使得我們能夠方便地返回以前訪問過的頁面,它無疑有用。但有時候我們必須關閉這個功能,以防止使用者打亂預定的頁面存取次序。本文介紹網路上可找到的各種停用瀏覽器後退按鈕方案,分析它們各自的優缺點和適用場合。   

一、概述

曾经有许多人问起,“怎样才能‘禁用'浏览器的后退按钮?”,或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”在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>   
 

登入後複製

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"]”为false
 
Session["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语句。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nvm 怎麼刪除node nvm 怎麼刪除node Dec 29, 2022 am 10:07 AM

nvm刪除node的方法:1、下載「nvm-setup.zip」並將其安裝在C碟;2、設定環境變量,並透過「nvm -v」指令查看版本號;3、使用「nvm install」指令安裝node;4、透過「nvm uninstall」指令刪除已安裝的node即可。

node專案中如何使用express來處理檔案的上傳 node專案中如何使用express來處理檔案的上傳 Mar 28, 2023 pm 07:28 PM

怎麼處理文件上傳?以下這篇文章為大家介紹一下node專案中如何使用express來處理文件的上傳,希望對大家有幫助!

Node服務怎麼進行Docker鏡像化?極致優化詳解 Node服務怎麼進行Docker鏡像化?極致優化詳解 Oct 19, 2022 pm 07:38 PM

這段時間在開發一個騰訊文檔全品類通用的HTML 動態服務,為了方便各品類接入的生成與部署,也順應上雲的趨勢,考慮使用Docker 的方式來固定服務內容,統一進行製品版本的管理。這篇文章就將我在服務 Docker 化的過程中累積起來的優化經驗分享出來,供大家參考。

深入淺析Node的進程管理工具'pm2” 深入淺析Node的進程管理工具'pm2” Apr 03, 2023 pm 06:02 PM

這篇文章跟大家分享Node的進程管理工具“pm2”,聊聊為什麼需要pm2、安裝和使用pm2的方法,希望對大家有幫助!

Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

聊聊用pkg將Node.js專案打包為執行檔的方法 聊聊用pkg將Node.js專案打包為執行檔的方法 Dec 02, 2022 pm 09:06 PM

如何用pkg打包nodejs可執行檔?以下這篇文章跟大家介紹一下使用pkg將Node專案打包為執行檔的方法,希望對大家有幫助!

npm node gyp失敗怎麼辦 npm node gyp失敗怎麼辦 Dec 29, 2022 pm 02:42 PM

npm node gyp失敗是因為“node-gyp.js”跟“Node.js”版本不匹配,其解決辦法:1、透過“npm cache clean -f”清除node快取;2、透過“npm install -g n”安裝n模組;3、透過「n v12.21.0」指令安裝「node v12.21.0」版本即可。

使用Angular和Node進行基於令牌的身份驗證 使用Angular和Node進行基於令牌的身份驗證 Sep 01, 2023 pm 02:01 PM

身份驗證是任何網路應用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統以及它們與傳統登入系統的差異。在本教程結束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統身份驗證系統在繼續基於令牌的身份驗證系統之前,讓我們先來看看傳統的身份驗證系統。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應用程式中受

See all articles