背景:我们正在编写注册/支付页面,我们的理念是首先在服务器端编码所有验证和错误检查,然后添加客户端验证作为第二步(非阻塞 jQuery)。
我们想禁用双击服务器端,所以我们编写了一些锁定的、线程安全的代码来处理同时发布/竞争条件。当我们尝试对此进行测试时,我们意识到我们不能导致同时发布或竞争条件发生。
我认为(无论如何在旧浏览器中)双击提交按钮的工作方式如下:
- 用户双击提交按钮。
- 浏览器在第一次点击时发送一个帖子
- 在第二次单击时,浏览器取消/忽略初始帖子,并启动第二个帖子(在第一个帖子返回响应之前)。
- 浏览器等待第二个帖子返回,忽略初始帖子响应。
我认为从服务器端看起来像这样:服务器同时收到两个发布请求,执行并响应它们(不知道没有人在听第一个响应)。
根据我们的测试(FireFox 3.0、IE 8.0),实际情况如下:
- 用户双击提交按钮
- 浏览器为第一次点击发送一个帖子
- 浏览器排队第二次点击,但等待第一次点击的响应。
- 响应从第一次单击返回(响应被忽略?)。
- 浏览器发送第二次点击的帖子。
所以从服务器端:服务器接收它执行并响应的单个帖子。然后,服务器接收到它执行并响应的第二个请求。
我的问题是,这是否一直如此(而且我正在失去理智)?或者这是现代浏览器中的一项新功能,可以防止同时将帖子发送到服务器?
似乎对于服务器端双击预防,我们不必担心同时发布或竞争条件。只需要担心排队的帖子。