热门标签 | 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;必备良药。



推荐阅读
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
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社区 版权所有