热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

防止页面刷新过多js_防止页面多次刷新提交表单(转)

当用户从表单处完成递交,如无问题已将注册信息写入数据库,但有问题的是,如何防止用户刷新页面,这相当于将原有的信息再次写入数据

当用户从表单处完成递交,如无问题已将注册信息写入数据库,但有问题的是,如何防止用户刷新页面,这相当于将原有的信息再次写入数据库,在网络上寻找解决方法,试用后将本人认为最管用的方法记下。

网络中给出如下解决方式:

第一种:禁用提交按钮

当用户提交表单后,使用Javascript脚本语言,将提交钮禁用。

分析:如客户端没有开启脚本功能就出现问题;这也仅是在表单处理前有用,防止用户多次点击提交钮;现在很多网站都启用验证码解决此问题了。

第二种:使用 Session

在第一次写入数据库代码后,将Session标记;在数据库代码前判断Session是否曾经标记过并与刚才的标记是否相等。

代码:

Session("User") = True

Response.write "您刚才已经注册过了……"

Else

...... '省略写入数据库部分

Session("User") = True

End if

分析:比较管用的;但Session默认时效为20分钟,虽然可以设置时效长度,但由于网站服务器设置不同,也许达不到理想效果。

第三种:重新定向

注册完毕后直接将网页重新定向到其他页面。

代码:Response.Redirect "Index.html"

分析:使用此方法,需要配合客户端脚本清除历史(history)才行,没有试用,因为用户可以使用后退按钮,继续刷新。

第四种:禁止缓存

在写入数据一页最下边添加下面的代码,然后导向新页,可以使用户点击后退按钮后,页面提示网页过期。

代码:

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()打开的窗口是无法用后退按钮的。

第六种:调数据库进行对比

这一种是得不偿失的方法,因为会加重服务器的负担,如果在表单没有进行AJAX方式的验证,这也算是一种必要的方法。

代码:(假设已连接数据库)

Dim Rs,SQL,UserId

UserId = Request("Userid") '从表单从取数据内容

If UserId <> "" then &#39;不为空的时候

Set Rs&#61;Server.CreateObject("Adodb.Recordset")

SQL &#61; "Select Userid From 表 Where Userid&#61;&#39;"& UserId &"&#39;"

Rs.Open Sql, Conn, 2, 2

If Rs.Eof And Rs.Bof Then

Response.Write "没有相同数据&#xff01;"

Else

Response.Write "有相同数据&#xff01;"

End If

Rs.Close

Set Rs &#61; Nothing

Response.End

End If

经过测试&#xff0c;如果不想太费事&#xff0c;直接用第六种方法&#xff0c;用户刷一次就对数据库检索一次&#xff0c;这种方式最大的弊端就是有可能把服务器累死&#xff1b;

由于&#xff0c;我采用了第二种方法&#xff0c;结合了第四种(效果不大)&#xff0c;在代码最前端加入了验证由何处来本站的函数&#xff0c;这样可以防止用户自己在本机模仿网站表单提交数据(hi.baidu.com/76512/blog/item/b8d9be8f168d3aedf01f3680.html)&#xff0c;也可以防止用户在本站直接在网址末端加变量值刷新数据。

由于在表单处已加入随机验证码&#xff0c;并已写入Session中&#xff0c;在处理数据前&#xff0c;可以先检测Session是否为空&#xff0c;空为已提交过了&#xff0c;不为空是第一次提交&#xff0c;在第一次提交后将该Session清空。

代码&#xff1a;

If Session("RndNum") &#61; ""

Response.Write "已提交过数据了呀&#xff01;"

Else

...... &#39;省略写入数据库代码

Session("RndNum") &#61; ""

End if

分析&#xff1a;只要是从正常的途径递交的表单&#xff0c;Session("RndNum")的数值不会为空的&#xff0c;从非正常途径(比如说&#xff0c;直接打开网址&#xff0c;或在本机模拟表单递交&#xff0c;或在网址后添加变量值&#xff0c;是无法写入数据库的。Session默认的20分钟&#xff0c;清空后仍然符合逻辑。也不怕用户打开几个注册页面&#xff0c;来回刷新注册。

禁用页面缓存的几种方法(静态和动态)

1、在Asp页面首部

加入

以下是引用片段&#xff1a;

Response.Buffer   &#61;   True

Response.ExpiresAbsolute   &#61;   Now()   -   1

Response.Expires   &#61;   0

Response.CacheControl   &#61;   "no-cache"

Response.AddHeader   "Pragma",   "No-Cache"

2、在HtML代码中加入

以下是引用片段&#xff1a;

3、在重新调用原页面的时候在给页面传一个参数   Href&#61;"****.asp?random()"

前两个方法据说有时会失效&#xff0c;而第三种则是在跳转时传一个随机的参数&#xff01; 因为aspx的缓存是与参数相关的&#xff0c;如果参数不同就不会使用缓存&#xff0c;而会重新生成页面&#xff0c;每次都传一个随机的参数就可以避免使用缓存。这个仅适用于asp&asp.net

4、在jsp页面中可使用如下代码实现无缓存&#xff1a;

以下是引用片段&#xff1a;

response.setHeader("Cache-Control","no-cache"); //HTTP 1.1

response.setHeader("Pragma","no-cache"); //HTTP 1.0

response.setDateHeader ("Expires", 0); //prevents caching at the proxy server

这些代码加在

中间具体如下

以下是引用片段&#xff1a;

response.setHeader("Cache-Control","no-cache"); //HTTP 1.1

response.setHeader("Pragma","no-cache"); //HTTP 1.0

response.setDateHeader ("Expires", 0); //prevents caching at the proxy server

%>

5、window.location.replace("WebForm1.aspx");

参数就是你要覆盖的页面&#xff0c;replace的原理就是用当前页面替换掉replace参数指定的页面。

这样可以防止用户点击back键。使用的是Javascript脚本&#xff0c;举例如下&#xff1a;

a.html

以下是引用片段&#xff1a;

a

function jump(){

window.location.replace("b.html");

}

b

b.html

以下是引用片段&#xff1a;

b

function jump(){

window.location.replace("a.html");

}

a

前4种只是清空了cache&#xff0c;即存储在Temporary Internet Files文件夹中的临时文件&#xff0c;而第五种则是使用跳转页面文件替换当前页面文件&#xff0c;并没有清空cache&#xff0c;也就是说Temporary Internet Files产生了相关的临时文件&#xff0c;两者搭配使用真是清空缓存&#xff0c;必备良药。



推荐阅读
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
author-avatar
mobiledu2502912277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有