我可以看到在这个问题上创建了几个主题,但我真的找不到可以应用于我的案例的解决方案。
我的问题是,当用户在我的页面上提交表单时,一些用户尝试在处理请求时刷新页面,并且在数据库中插入了两次行。脚本中间有两个 curl 调用,这可能需要几秒钟才能完成,这就是导致延迟的原因。我相信通过刷新页面,他们会打开一个具有相同会话详细信息的新连接并再次提交,但废弃的后端脚本仍在处理该过程。最重要(也是最糟糕的)事情是,表单发布到自身。
我们尝试应用多种措施(擦除 SESSION 以跟踪生成的会话变量等...)我相信表单上的隐藏字段不是一个选项,因为随后可能会使用伪造的浏览器攻击流程脚本。
我的建议是从视图中分离流程部分并将其迁移到单独的脚本并通过 Ajax 调用它。在调用 Ajax 时,禁用提交按钮会提示用户在处理页面时不要刷新页面。这样,即使他们刷新页面,它也不会再次提交,届时进程可以设置 SESSION 变量以防止重新提交。
您对此解决方案有何看法?
请不要向我发布这样的事情是坏的或对过程不好的事情并改变这个或那个,因为我无法在整个系统建立在它之上的过程中做出任何重大改变。
非常感谢。
////////////////////////////////////////// ///////////////////////
扩大:
- 将自发布怪物脚本的流程部分迁移到 Ajax 脚本中。
- 触发 ajax 后,我禁用提交按钮并显示带有文本的微调器,不要刷新浏览器
- 当在 Ajax 脚本中完成操作时,我设置了一个会话变量,指示该过程已完成
- 如果他们仍然刷新浏览器,表单数据将被清除,他们根本没有足够的时间再次填写,所以当他们再次提交表单时,会话变量已经设置并按下提交按钮他们会收到一条消息,然后重定向到确认页面。
到目前为止,经过几次测试运行,它似乎运行良好。
大家觉得这个解决方案怎么样?是否存在任何漏洞或安全隐患?(错误消息来自脚本通过 Json)