一、概述
当处理请求的时间较长时,它可能导致用户多次提交同一表单。这不仅会使应用程序出现问题,而且还会进一步延缓请求处理时间。但是,只要使用一个简单的JavaScript函数,我们就可以防止用户多次提交同一表单,而且能够在长时间请求处理期间提醒用户。
想象一下这种情形:你在Web商店花了半个小时,最后终于到了付款的页面。你再次检查了购物篮里面的各种商品和合计金额,然后输入信用卡信息并点击“提交”按钮。这时,浏览器上出现了沙漏鼠标指针。你等了10秒、15秒还是没有看到应答。于是,你就再次点击“提交”按钮,开始了下一个15秒的等待——还是没有应答。这时你已经完全失去了耐心,多次重复地点击“提交”按钮。最后,在失望之中,你选择了放弃。
在我看来,对于Web浏览来说,人们愿意等待的时间大约是4秒。如果用户在提交请求之后,4秒之内没有看到任何应答,他们会假定应用程序的某个地方出了问题。你可能已经在许多网站上遇到过这个问题。在一些大型网站上,你可能还看到过“多次提交同一请求只能导致处理延迟”之类的警告。
导致请求处理延迟的原因有很多:
· 网络负荷过重。
· 数据库瓶颈可能延长服务器端的处理时间。
· 等待Web服务器处理的请求数量太多。
如果请求处理延迟是由于上述原因之一造成,重新提交请求只会把事情搞得更糟。一些Web开发者强调说他们在服务器上运行的代码很健壮,即使用户多次提交同一请求,服务器端代码也能够保证只有一个记录会被插入数据库。也许这能够避免出现错误,然而,这是解决问题的最好方法吗?
二、为什么多次请求可能导致问题?
HTTP是一种无状态的协议。无论是Web服务器还是Web客户端,都不会维持会话状态信息。当你点击一个链接或者提交一个表单,浏览器建立了与服务器之间的一个连接,提交请求,读取应答,接着服务器和浏览器都会关闭这个连接。对于每一个请求,浏览器都要建立与服务器的一个新连接;每一个浏览器实例每次只使用一个连接。
因此,如果用户一次又一次地点击“提交”按钮,他们实际上是在:建立与Web服务器的连接,提交请求,然后在不等待服务器回应的情况下立即关闭与服务器的连接。服务器忠实地处理这些重复的请求,但由于客户端已经中断了连接,服务器不知道如何才能返回结果,因此它就丢弃处理结果。这不仅浪费了宝贵的服务器资源,而且延长了服务器的请求队列——甚至还有可能导致服务器故障。
解决这个问题要从两方面进行:第一,防止用户重复提交请求;第二,给用户足够的提示信息,使他们不再感到有重复提交请求的必要。幸运的是,我们可以用JavaScript同时解决这两方面的问题。
三、简单的JavaScript解决方案
不要直接提交请求,而是编写一个提交请求的JavaScript。在提交请求之前,JavaScript脚本首先检查用户是否已经提交了同样的请求。
这些JavaScript禁止用户多次提交同一请求。只要在每个页面中加入上面这些简单的JavaScript代码,你就能够确保用户只提交一次请求。
如果你觉得这种方法对用户太不礼貌,那么,你可以显示一个进度提示框、一个动画或其他有趣玩意吸引用户注意力,直到服务器处理完请求发回结果。