2023年11月28日发(作者:)

JSP防⽌⽹页刷新重复提交数据的⼏种⽅法

本篇⽂章主要介绍了⽹页如何防⽌刷新重复提交与如何防⽌后退的解决⽅法,具体如下:

提交后禁⽤提交按钮(⼤部分⼈都是这样做的)

如果客户提交后,F5刷新怎么办?

使⽤Session

在提交的页⾯也就是数据库处理之前:

if session("ok")=true then

"错误,正在提交"

end if

数据处理完后,修改session("ok")=false

数据处理成功马上Redirect到另外⼀个页⾯

操作后刷新的确是个问题,你可以使⽤跳转页⾯、关闭本页⾯,如果是有参数据条件来控制的,那就应该好做了,可以直接修

on的值,把参数全部改掉,这样就差不多了。

缺点:简单地运⽤ct将不再有效,因为⽤户从⼀个页⾯转到另⼀个页⾯,我们都必须⽤客户端代码清除

y。注意,这种⽅法清除的是最后⼀个访问历史记录,⽽不是全部的访问记录。 点击后退按钮,再点击后退按

钮,你可以看到这时打开的是本页⾯之前的页⾯!(当然,这是在你的客户端启⽤了JavaScript功能的条件下。)

如果客户按后退,怎么办?

防⽌⽹页后退--禁⽌缓存

我们在进⾏数据库添加操作的时候,如果允许后退,⽽正巧有刷新了页⾯,就会再次执⾏添加操作,⽆疑这不是我们需要的,

像⼀般⽹上很多禁⽌缓存的代码,有时并不可靠,这时你只要在操作的页⾯加上就可以了,在⽹页的⾥指定要定向的新页,再

点后退,看是不是不会再退到刚才的操作页⾯了,实际上已经把这个历史给删除了

ASP

= True

sAbsolute = Now() - 1

s = 0

ontrol = "no-cache"

=true;

sAbsolute=onds(-1);

s=0;

ontrol="no-cache";

究竟怎样才能"禁⽤"浏览器的后退按钮?或者怎样才能防⽌⽤户点击后退按钮返回以前浏览过的页⾯?

遗憾的是,我们⽆法禁⽤浏览器的后退按钮。

防⽌⽹页后退--新开窗⼝

弹出表单页⾯,点提交后关闭该页;处理提交的ASP页也是⽤弹出,设定表单的target,点提交时

("","_blank"),然后⽤JS来提交表单,完成后()

简单的说,就是提交表单的时候弹出新窗⼝,关闭本窗⼝。对于()打开的窗⼝怎么后退?能后退到哪⾥去?

呵呵,罗嗦了⼀堆废话,知道怎么处理了么?混合运⽤客户端脚本和服务器端脚本。

jsp重复提交问题

看了⽹上的,有⼏种⽅法:

1 在你的表单页⾥HEAD区加⼊这段代码:

2 ⽣成⼀个令牌保存在⽤户session中,在form中加⼀个hidden域,显⽰该令牌的值,form提交后重新⽣成⼀个新的令牌,将

⽤户提交的令牌和session 中的令牌⽐较,如相同则是重复提交

3 在你的服务器端控件的代码中使⽤ct("selfPage")语句。但是⼤多的数都不使⽤这种⽅法。

⽅法还有很多。。。

4

5 JSP页⾯的FORM表单中添加⼀个hidden

>

在你的serverletJava代码)中添加如下语句

String url=ameter("url");

direct(url);

我⼀般都是采⽤这样的⽅法返回JSP页⾯的,不太明⽩你说的重复刷新是什么概念

6 ajax ⽆刷新提交

7 Web开发中防⽌浏览器的刷新键引起系统操作重复提交

怎么解决呢?重定向可以解决页⾯刷新带来的数据的重复提交的问题,我们⾃然可以利⽤重定向的⽅式来解决这个问题。但是

strutsaction⾥⾯rd();跳转的话,默认的是在⼯程⽂件夹⾥⾯找要跳转的页⾯。这种情况,怎么解决呢?

修改struts ⽂件, action⾥⾯有⼀个redirect重新定向的属性,struts中默认的是false,添加这个属性,改成

true,在forword中写上要跳转页⾯的绝对或者相对地址就⾏了

修改如下:

input="/" path="/newsAction" parameter="method"

scope="request" type="tion">

浏览器相关难处理的问题

浏览器的后退按钮使得我们能够⽅便地返回以前访问过的页⾯,它⽆疑⾮常有⽤。但有时候我们不得不关闭这个功能,以防⽌

⽤户打乱预定的页⾯访问次序。本⽂介绍⽹络上可找到的各种禁⽤浏览器后退按钮⽅案,分析它们各⾃的优缺点和适⽤场合。

⼀、概述

曾经有许多⼈问起,怎样才能禁⽤'浏览器的后退按钮?,或者怎样才能防⽌⽤户点击后退按钮返回以前浏览过的页⾯?

ASP论坛上,这个问题也是问得最多的问题之⼀。遗憾的是,答案⾮常简单:我们⽆法禁⽤浏览器的后退按钮。

起先我对于居然有⼈想要禁⽤浏览器的后退按钮感到不可思议。后来,看到竟然有那么多的⼈想要禁⽤这个后退按钮,我也就

释然(想要禁⽤的只有后退按钮,不包括浏览器的前进按钮)。因为在默认情况下,⽤户提交表单之后可以通过后退按钮返回

表单页⾯(⽽不是使⽤编辑按钮!),然后再次编辑并提交表单向数据库插⼊新的记录。这是我们不愿看到的。

因此我就决定要找出避免出现这种情况的⽅法。我访问了许多⽹站,参考了这些⽹站所介绍的各种实现⽅法。如果你经常访问

ASP编程⽹站,本⽂所介绍的部分内容你可能已经见到过。本⽂的任务是把各种可能的⽅法都介绍给⼤家,然后找出最好的

⽅法!

⼆、禁⽌缓存

在我找到的许多⽅案中,其中有⼀种建议禁⽌页⾯缓存。具体是使⽤服务器端脚本,如下所⽰:

<%

= True

sAbsolute = Now() - 1

s = 0

ontrol = "no-cache"

%>

这种⽅法⾮常有效!它强制浏览器重新访问服务器下载页⾯,⽽不是从缓存读取页⾯。使⽤这种⽅法时,编程者的主要任务是

创建⼀个会话级的变量,通过这个变量确定⽤户是否仍旧可以查看那个不适合通过后退按钮访问的页⾯。由于浏览器不再缓存

这个页⾯,当⽤户点击后退按钮时浏览器将重新下载该页⾯,此时程序就可以检查那个会话变量,看看是否应该允许⽤户打开

这个页⾯。

例如,假设我们有如下表单:

<%

= True

sAbsolute = Now() - 1

s = 0

ontrol = "no-cache"

If Len(Session("FirstTimeToPage")) > 0 then

&single; ⽤户已经访问过当前页⾯,现在是再次返回访问。

&single; 清除会话变量,将⽤户重定向到登录页⾯。

Session("FirstTimeToPage") = ""

ct "/"

End If

&single; 如果程序运⾏到这⾥,说明⽤户能够查看当前页⾯

&single; 以下开始创建表单

%>

我们借助会话变量FirstTimeToPage检查⽤户是否是第⼀次访问当前页⾯。如果不是第⼀次(即Session("FirstTimeToPage")

包含某个值),那么我们就清除会话变量的值,然后把⽤户重新定向到⼀个开始页⾯。这样,当表单提交时(此时

被打开),我们必须赋予FirstTimeToPage⼀个值。即,在中我们需要加上下⾯的代码:

Session("FirstTimeToPage") = "NO"

这样,已经打开的⽤户如果点击后退按钮,浏览器将重新请求服务器下载页⾯,服务器检查到

Session("FirstTimeToPage")包含了⼀个值,于是就清除Session("FirstTimeToPage"),并把⽤户重定向到其他页⾯。当然,

所有这⼀切都需要⽤户启⽤了Cookie,否则会话变量将是⽆效的。

另外,我们也可以⽤客户端代码使浏览器不再缓存Web页⾯:

如果使⽤上⾯的⽅法强制浏览器不再缓存Web页⾯,必须注意以下⼏点:

只有在使⽤安全连接时“Pragma: no-cache”才防⽌浏览器缓存页⾯。对于不受安全保护的页⾯,“Pragma: no-cache”被视为

“Expires: -1”相同,此时浏览器仍旧缓存页⾯,但把页⾯标记为⽴即过期。在IE 45中,“Cache-Control”META HTTP-

EQUIV标记将被忽略,不起作⽤。

在实际应⽤中我们可以加上所有这些代码。然⽽,由于这种⽅法不能适⽤于所有的浏览器,所以是不推荐使⽤的。但如果是在

Intranet环境下,管理员可以控制⽤户使⽤哪种浏览器,我想还是有⼈会使⽤这种⽅法。

三、其他⽅法

接下来我们要讨论的⽅法以后退按钮本⾝为中⼼,⽽不是浏览器缓存。这⼉有⼀篇⽂章Rewiring the Back Button很值得参

考。不过我注意到,如果使⽤这种⽅法,虽然⽤户点击⼀下后退按钮时他不会看到以前输⼊数据的页⾯,但只要点击两次就可

以,这可不是我们希望的效果,因为很多时候,固执的⽤户总是能够找到绕过预防措施的办法。

另外⼀种禁⽤后退按钮的办法是⽤客户端JavaScript打开⼀个没有⼯具条的窗⼝,这使得⽤户很难返回前⼀页⾯,但不是不可

能。⼀种更安全但相当恼⼈的⽅法是,当表单提交时打开⼀个新的窗⼝,与此同时关闭表单所在的窗⼝。但我觉得这种⽅法不

值得认真考虑,因为我们总不能让⽤户每提交⼀个表单就打开⼀个新窗⼝。

那么,在那个我们不想让⽤户返回的页⾯是否也可以加⼊JavaScript代码呢?在这个页⾯中加⼊的JavaScript代码可⽤来产⽣

同样地,这种⽅法虽然有效,但距离最好的⽅法还差得很远。后来我⼜看到有⼈建议⽤e从⼀个页⾯转到另⼀

个页⾯。这种⽅法的原理是,⽤新页⾯的URL替换当前的历史纪录,这样浏览历史记录中就只有⼀个页⾯,后退按钮永远不

会变为可⽤。我想这可能正是许多⼈所寻求的⽅法,但这种⽅法仍旧不是任何情况下的最好⽅法。使⽤这种⽅法的实例如下所

⽰:

禁⽌后退到本页⾯的链接

禁⽌后退到本页⾯的链接!

这种⽅法的缺点在于:简单地运⽤ct将不再有效,这是因为每次⽤户从⼀个页⾯转到另⼀个页⾯,我们都必

须⽤客户端代码清除y。另外还要注意,这种⽅法清除的是最后⼀个访问历史记录,⽽不是全部的访问记录。

点击上⾯的链接,你将打开⼀个简单的HTML页⾯。再点击后退按钮,你可以看到这时打开的不是本页⾯,⽽是本页⾯之前的

页⾯!(当然,你必须在浏览器中启⽤了客户端JavaScript代码。)

经过⼀番仔细的寻寻觅觅之后,我发现仍旧⽆法找出真正能够完全禁⽤浏览器后退按钮的办法。所有这⾥介绍的⽅法都能够在

不同程度上、以不同的⽅式禁⽌⽤户返回前⼀页⾯,但它们都有各⾃的局限。由于不存在能够完全禁⽤后退按钮的⽅法,所以

最好的⽅案应该是:混合运⽤客户端脚本和服务器端脚本。

中防刷新重复提交、防后退⽅法

简单操作⽅法防后退和刷新

Page_Load中加⼊

tore();

//Session中存储的变量“IsSubmit”是标记是否提交成功的

if (!IsPostBack)

提交按钮中加⼊

Session["IsSubmit"] = true;

ct ("本页");

另外:

1、通常应该在业务层进⾏判断(唯⼀性)解决这种问题

2、要在页⾯装载事件写上 ontrol = "no-cache" 清除缓存

3、也有⼈这样说:我以前也碰到过这样的问题,是在分步提交中⼀个⼈的简历,在写完第⼀个页⾯后跳到第⼆个页⾯,为了

防⽌⽤户⽤后退返回到第⼀个页⾯,再重新提交第⼀个页⾯,我是当⽤户提交第⼀次提交第⼀个页⾯时,把插⼊数据库中的记

录的⾃增长id号放到session⾥,当⽤户从第⼆个页⾯返回到第⼀个页⾯再⼀次提交该页⾯时,我就⽤session⾥的值去数据库

查,如果有这个id就⽤update语句把第⼀个页⾯的数据写进数据库,如果没有查到这个id,就⽤insert语句。

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。