JSP防⽌⽹页刷新重复提交数据的⼏种⽅法
本篇⽂章主要介绍了⽹页如何防⽌刷新重复提交与如何防⽌后退的解决⽅法,具体如下:
提交后禁⽤提交按钮(⼤部分⼈都是这样做的)
如果客户提交后,按F5刷新怎么办?
使⽤Session
在提交的页⾯也就是数据库处理之前:如何启用javascript功能
if session("ok")=true then
response.write "错误,正在提交"
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">
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=<%=RequestURL()%>>
在你的serverlet(Java代码)中添加如下语句
String Parameter("url");
response.sendRedirect(url);
我⼀般都是采⽤这样的⽅法返回JSP页⾯的,不太明⽩你说的重复刷新是什么概念
6 ajax ⽆刷新提交
7 Web开发中防⽌浏览器的刷新键引起系统操作重复提交
怎么解决呢?重定向可以解决页⾯刷新带来的数据的重复提交的问题,我们⾃然可以利⽤重定向的⽅式来解决这个问题。但是struts的action⾥⾯mapping.findword();跳转的话,默认的是在⼯程⽂件夹⾥⾯要跳转的页⾯。这种情况,怎么解决呢?
修改struts-l ⽂件,在action⾥⾯有⼀个redirect重新定向的属性,struts中默认的是false,添加这个属性,改成true,在forword中写上要跳转页⾯的绝对或者相对地址就⾏了
修改如下:
<action-mappings>
<action attribute="newsActionForm" name="newsActionForm"
input="/addnews.jsp" path="/newsAction" parameter="method"
scope="request" type="ws.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>
同样地,这种⽅法虽然有效,但距离“最好的⽅法”还差得很远。后来我⼜看到有⼈建议⽤place从⼀个页⾯转到另⼀个页⾯。这种⽅法的原理是,⽤新页⾯的URL替换当前的历史纪录,这样浏览历史记录中就只有⼀个页⾯,后退按钮永远不会变为可⽤。我想这可能正是许多⼈所寻求的⽅法,但这种⽅法仍旧不是任何情况下的最好⽅法。使⽤这种⽅法的实例如下所⽰:
<A HREF="PageName.htm" onclick="place(this.href);
禁⽌后退到本页⾯的链接!
这种⽅法的缺点在于:简单地运⽤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中防刷新重复提交、防后退⽅法
简单操作⽅法防后退和刷新
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语句。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论