如何停止重新提交表单的"后退"和"刷新"按钮?

23 javascript browser double-submit-prevention

我在做网络开发.

我有一个与信用卡有关的页面,当用户点击"刷新"或"返回"时,交易将再次执行,这是不需要的.

这包括浏览器左上角的"后退"和"刷新"按钮,"右键单击 - >刷新/返回",按"F5"键.这只能在某些cgi页面上完成,而不是全部.

可以使用Javascript完成吗?还是其他方法?

var*_*tec 48

标准的方法是做它在3个步骤.

  1. 表单页面将字段提交到处理页面
  2. 处理页面处理数据并重定向到结果页面
  3. 结果页面只显示结果,重新加载它不会造成任何伤害.

  • 如果用户点击"返回"(如果他们告诉他们的浏览器重新提交),这不会阻止表单被重新处理 (24认同)
  • 也称为Post-Redirect-Get模式. (15认同)
  • @ philfreo-实际上,它确实阻止了它.今天的大多数框架都会发出一个"302 Moved"标题,它有效地告诉浏览器在后退按钮导航期间使用结果页面来显示历史记录. (4认同)

Ric*_*ett 12

这打破了基本的浏览器用户体验模型......用户应该始终能够在浏览器中使用"刷新"和"返回"按钮.建议您以其他方式修复页面.

如果您更新问题以包含您正在使用的服务器语言/平台/技术,那么有人可能会建议解决方案.


Jam*_*eld 8

重新提交表单生成重复事务的简单事实令人担忧.您应该进行某种检查以确保每次提交表单数据都是唯一的.

例如,提交表单的页面应该被赋予一个随表单提交的唯一ID.然后,业务逻辑应该能够识别提交的表单已经被处理(因为(不再)唯一ID将是相同的),因此忽略第二次尝试.

"标准方式"仍然不会阻止客户端点击两次后退按钮...甚至如果他们不认为(无论出于何种原因)已经处理过,则返回并重新提交表单.


Ano*_*ous 5

  1. 生成随机字符串并将其存储在会话中,

  2. 然后将其作为隐藏值输出到您的表单,

  3. 检查提交和存储变量,如果匹配处理您的请求,

  4. 去1.