如何阻止“返回”和“刷新”按钮重新提交我的表单?

IT技术 javascript browser double-submit-prevention
2021-02-17 08:04:03

我在做网络开发。

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

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

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

6个回答

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

  1. 表单页面提交字段到处理页面
  2. 处理页面处理数据并重定向到结果页面
  3. 结果页面只显示结果,重新加载它不会造成任何伤害。
在单页应用程序中,有人发布到您的应用程序的地方呢?
2021-04-15 08:04:03
@philfreo-实际上,它确实阻止了它。今天的大多数框架都会发布一个“302 Moved”标题,它有效地告诉浏览器在后退按钮导航期间使用历史结果页面。
2021-04-16 08:04:03
也称为重定向后获取模式。
2021-04-22 08:04:03
@jamiebarrow:在 SPA 中,您将使用 AJAX 调用来提交表单。
2021-04-25 08:04:03
如果用户点击“返回”(如果他们告诉浏览器重新提交),这不会阻止重新处理表单
2021-04-29 08:04:03

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

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

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

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

“标准方式”仍然不会阻止客户两次单击后退按钮……或者如果他们认为(无论出于何种原因)没有处理过表单,甚至会返回并重新提交表单。

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

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

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

  4. 去 1。

你所说的“存储value”是什么意思?
2021-05-13 08:04:03

将此代码放在表单页面上

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0));

Response.Cache.SetLastModified(DateTime.Now);

Response.Cache.SetAllowResponseInBrowserHistory(false);
这段代码应该做什么?当用户点击后退按钮时使页面过期?
2021-05-10 08:04:03
+1 这是 C# 代码,如果用户尝试在其浏览器上单击“返回”,它将使浏览器发出“页面已过期”警告
2021-05-13 08:04:03