查看文章 |
{Z}http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!394.entry?fl=cat 一。前言 你在任何一个比较专业的BBS都会看到这样的问题,即使你Google一下,也会发现有很多的人在关注和询问,但大家给出的解决方法却都是千差万别,(有的人主张采用脚本来解决;有的则想重定向到别的页面;有的则将此问题提升到Token的角度)为什么会有如此大的差异呢? 二。问题场景 1。重复提交、重复刷新的场景 但出现了这样的问题并不见得就必须处理,要看你所开发的系统的类别而定。比如你接手的是某个资源管理系统,系统本身从需求的角度根本就不允许出现"重复"的记录,在这样需求的约束条件下,去执行重复的提交动作只会引发“业务级异常”的产生,根本就不可能执行成功也就无所谓避免不避免的问题了。
2。防止后退的场景
客户端处理: 1。重复刷新、重复提交 Way Two : 将提交按钮或者image置为disable 2。防止用户后退
基本原理: if (isTokenValid(request, true)) { Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考 1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
3. action有这样的一个方法生成令牌 总结 同时我们也看到,从不同的角度去看待问题,其解决的方法也是不同的。客户端更追求的是用户的操作,而服务端则将注意力放在了数据的处理上,所以在某个对于服务器端看似容易的问题上,用客户端来解决却麻烦了很多!反之依然。所以在某些问题的处理上我们需要综合考虑和平衡,是用客户端来解决?还是用服务器端来处理? ====第一篇==结束==========================================================================
====第二篇==开始========================================================================== 网页防刷新重复提交、防后退解决方法 提交后禁用提交按钮(大部分人都是这样做的) 如果客户提交后,按F5刷新怎么办? 使用Session 在提交的页面也就是数据库处理之前: if session("ok")=true then 数据处理完后,修改session("ok")=false。 数据处理成功马上Redirect到另外一个页面 操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) 如果客户按后退,怎么办? 我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 ASP: ASP.NET: 究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?” 遗憾的是,我们无法禁用浏览器的后退按钮。 防止网页后退--新开窗口 用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close(); 呵呵,罗嗦了一堆废话,知道怎么处理了么?混合运用客户端脚本和服务器端脚本。 ====第二篇==结束========================================================================== ====第三篇==开始========================================================================== 看了网上的,有几种方法: 5 在JSP页面的FORM表单中添加一个hidden域 6 ajax 无刷新提交
6.5 IFRAME无刷新提交: 表单提交的时候,提交到ifrmae页面中,本页面不刷新,然后在iframe页面中接收(象平常发送到第二页面一样接收),就可以了 <body>
7 Web开发中防止浏览器的刷新键引起系统操作重复提交
====第四篇==开始========================================================================== 浏览器相关难处理的问题 浏览器的后退按钮使得我们能够方便地返回以前访问过的页面,它无疑非常有用。但有时候我们不得不关闭这个功能,以防止用户打乱预定的页面访问次序。本文介绍网络上可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适用场合。 一、概述 二、禁止缓存 在我找到的许多方案中,其中有一种建议禁止页面缓存。具体是使用服务器端脚本,如下所示: 三、其他方法 同样地,这种方法虽然有效,但距离“最好的方法”还差得很远。后来我又看到有人建议用location.replace从一个页面转到另一个页面。这种方法的原理是,用新页面的URL替换当前的历史纪录,这样浏览历史记录中就只有一个页面,后退按钮永远不会变为可用。我想这可能正是许多人所寻求的方法,但这种方法仍旧不是任何情况下的最好方法。使用这种方法的实例如下所示: <script language="JavaScript"> ====第四篇==结束========================================================================== ====第五篇==开始========================================================================== Asp.net中防刷新重复提交、防后退方法 Response.Cache.SetNoStore(); //Session中存储的变量“IsSubmit”是标记是否提交成功的 { //如果表单数据提交成功,就设“Session["IsSubmit"]”为false Session["IsSubmit"] = false; //显示提交成功信息 TextBox1.Text = " * 提交成功!"; } {//否则的话(没有提交,或者是页面刷新),不显示任何信息 TextBox1.Text = ""; ====第五篇==结束========================================================================== 另外: 1、通常应该在业务层进行判断(唯一性)解决这种问题 2、要在页面装载事件写上 Response.CacheControl = "no-cache" 清除缓存 3、也有人这样说:我以前也碰到过这样的问题,是在分步提交中一个人的简历,在写完第一个页面后跳到第二个页面,为了防止用户用后退返回到第一个页面,再重新提交第一个页面,我是当用户提交第一次提交第一个页面时,把插入数据库中的记录的自增长id号放到session里,当用户从第二个页面返回到第一个页面再一次提交该页面时,我就用session里的值去数据库查,如果有这个id就用update语句把第一个页面的数据写进数据库,如果没有查到这个id,就用insert语句。 |