当用户从表单处完成递交,如无问题已将注册信息写入数据库,但有问题的是,如何防止用户刷新页面,这相当于将原有的信息再次写入数据库,在网络上寻找解决方法,试用后将本人认为最管用的方法记下。
网络中给出如下解决方式:
第一种:禁用提交按钮
当用户提交表单后,使用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;必备良药。