怎样能有效地防止重复提交表单?

怎样能有效地防止重复提交表单?,第1张

浏览器的后退按钮使得我们能够方便地返回以前访问过的页面,它无疑非常有用。但有时候我们不得不关闭这个功能,以防止用户打乱预定的页面访问次序。本文介绍网络上可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适用场合。
一、概述
曾经有许多人问起,“怎样才能‘禁用’浏览器的后退按钮?”,或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”我访问了许多网站,参考了这些网站所介绍的各种实现方法。如果你经常访问ASP编程网站,本文所介绍的部分内容你可能已经见到过。本文的任务是把各种可能的方法都介绍给大家,然后找出最好的方法!
二、禁止缓存
在我找到的许多方案中,其中有一种建议禁止页面缓存。具体是使用服务器端脚本,如下所示:
<%
ResponseBuffer = True
ResponseExpiresAbsolute = Now() - 1
ResponseExpires = 0
ResponseCacheControl = “no-cache“
%>
这种方法非常有效!它强制浏览器重新访问服务器下载页面,而不是从缓存读取页面。使用这种方法时,编程者的主要任务是创建一个会话级的变量,通过这个变量确定用户是否仍旧可以查看那个不适合通过后退按钮访问的页面。由于浏览器不再缓存这个页面,当用户点击后退按钮时浏览器将重新下载该页面,此时程序就可以检查那个会话变量,看看是否应该允许用户打开这个页面。
例如,假设我们有如下表单
<%
ResponseBuffer = True
ResponseExpiresAbsolute = Now() - 1
ResponseExpires = 0
ResponseCacheControl = “no-cache“
If Len(Session(“FirstTimeToPage“)) > 0 then
“用户已经访问过当前页面,现在是再次返回访问。
“清除会话变量,将用户重定向到登录页面。
Session(“FirstTimeToPage“) = ““
ResponseRedirect “/Barasp“
ResponseEnd
End If
“如果程序运行到这里,说明用户能够查看当前页面
“以下开始创建表单
%>
<form method=post action=“SomePageasp“>
<input type=submit>
</form>
我们借助会话变量FirstTimeToPage检查用户是否是第一次访问当前页面。如果不是第一次(即Session(“FirstTimeToPage“)包含某个值),那么我们就清除会话变量的值,然后把用户重新定向到一个开始页面。这样,当表单提交时(此时SompePageasp被打开),我们必须赋予FirstTimeToPage一个值。即,在SomePageasp中我们需要加上下面的代码:
Session(“FirstTimeToPage“) = “NO“
这样,已经打开SomePageasp的用户如果点击后退按钮,浏览器将重新请求服务器下载页面,服务器检查到Session(“FirstTimeToPage“)包含了一个值,于是就清除Session(“FirstTimeToPage“),并把用户重定向到其他页面。当然,所有这一切都需要用户启用了Cookie,否则会话变量将是无效的。
另外,我们也可以用客户端代码使浏览器不再缓存Web页面:
<html>
<head>
<meta >用户重复提交表单在某些场合将会造成非常严重的后果。例如,在使用xyk进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张xyk上的金额被消费了多次。因此,重复提交表单会对你的系统带来逻辑影响,必须采 用户重复提交表单在某些场合将会造成非常严重的后果。例如,在使用xyk进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张xyk上的金额被消费了多次。因此,重复提交表单会对你的系统带来逻辑影响,必须采取一些措施防止这类情况的发生。 用户重复提交同一个HTML表单的原因有:快速多次点击提交按钮;提交表单后按下浏览器的刷新按钮。 设置Struts 2的预防表单重复提交的功能 Struts 2已经内置了能够防止用户重复提交同一个HTML表单的功能。它的工作原理:让服务器生成一个唯一标记,并在服务器和表单里各保存一份这个标记的副本。此后,在用户提交表单的时候,表单里的标记将随着其他请求参数一起发送到服务器,服务器将对他收到的标记和它留存的标记进行比较。如果两者匹配,这次提交的表单被认为是有效的,服务器将对之做出必要的处理并重新设置一个新标记。随后,提交相同的表单就会失败,因为服务器上的标记已经重置。 Struts 2标签中的token标签,可以用来生成一个独一无二的标记。

使用一个简单的枚举值:
enum CheckFromSumbit
{
No1= 0,
Yes = 1
}
只要用户提交了,就取枚举的 Yes
每次提交前,简单判断枚举值是Yes还是No 就是了~~~~~~~~~
如果是Yes ,表示已经提交了~~~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13324752.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-15
下一篇 2023-07-15

发表评论

登录后才能评论

评论列表(0条)

保存