【问题标题】:Prevent form redirect after submit without ajax在没有ajax的情况下提交后防止表单重定向
【发布时间】:2013-12-09 20:53:14
【问题描述】:

我的 html 中有一个表单,其中包含指向不同域的操作 url。提交后,它重定向浏览器。我希望它被提交但不重定向到另一个页面。我知道我可以使用 Ajax 提交它,但由于域不同,它会给出 CORS 错误。我无法在我自己的 php 文件中镜像请求,因为表单提交是由虚拟信用卡支付系统进行的,它不允许您镜像它。

那么,有没有什么方法可以提交表单但不使用 ajax 来防止重定向。据我所知,使用 ajax 向不同的域发出请求是不可能的。

【问题讨论】:

  • 如果不控制 CORS,您基本上就没有运气了。您可以将表单提交定位到新窗口,但怀疑这有什么帮助。

标签: javascript php jquery ajax forms


【解决方案1】:

解决方案 1

AJAX 可以跨域。您需要目标域在响应中设置适当的标头。

Access-Control-Allow-Origin: yourdomain.com
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Headers: [anything else you might send]

return false 来自您的 ajax 调用或调用 preventDefault() 以防止浏览器重定向页面。

解决方案 2

提交到您自己的服务器端代码并​​模拟交易。但是,您提到他们不允许您镜像它,而且我没有解决此问题的详细信息。您可以向自己的服务器提交 AJAX(没有 CORS 问题且不需要标头)或普通 POST。

解决方案 3 将其提交给他们的服务器,但让他们的服务器重定向回您自己网站上的页面。 通常有一种方法可以通过他们给你的任何 API 控制面板进行设置。 再一次,没有具体细节,我无法直接解决问题

解决方案 4 在 iframe 中加载数据并在 iframe 中提交。这可能会有问题,具体取决于X-Frame-Options 的值,或者它们是否具有某种 CSRF 令牌,但您应该能够在 iframe 中发布表单而无需重定向主页。 iframe 也可以隐藏并通过 JS 提交(在表单上使用 submit() 方法--不需要 ajax)

【讨论】:

  • 解决方案 1 OP 无法控制其他域,所以他们如何设置标头!?解决方案 2,不允许镜像解决方案 3,无法控制第 3 方
  • 如果它是通过第三方 API 处理的,大多数情况下允许对提交的数据以及之后重定向到哪里进行控制。正如我在答案中提到的,我不知道 OP 正在使用的产品的具体细节,但查看它们可能允许您配置的任何选项可能会有所帮助。许多其他流行的 API 允许您从用户的浏览器提交数据(即登录凭据、数据请求)并将它们重定向回您自己的域。
  • 可能,我会选择解决方案 3。默认情况下,信用卡公司表单会将答案重定向到我的域,但这是时间损失,因为我应该在此重定向后检查付款是否成功。防止重定向并在之后检查它会更有效。
【解决方案2】:

我想你可以用 iFrame 做一些事情。

所以逻辑是:

  • 有一个空的<div>display:none;
  • 有一个<form action='self.php'>
  • 提交并preventDefault()
  • 使用查询字符串构建 URL
    • 最好是完全不同的页面newself.php?var1=something&var2=anotherthing
  • 使用 URL+查询字符串将<iframe> 附加到隐藏的<div>
    • $('div').append('<iframe src="newself.php?var1=something&var2=anotherthing"><iframe>");
  • 从 URL 获取内容并构建副本表单
  • newself.php 一些 JS 以在文档加载时自动将表单提交到 API URL
  • 清除隐藏的<div> 内容以等待新的提交

原创

我要离开这里是因为有人在我编辑 lol 时投了赞成票

为了提交到不同的域,他们必须打开服务器以接受跨域 POST。

所以这里是你应该研究的逻辑:

  • AJAX 提交到您的 PHP 文件并执行 e.preventDefault()
  • 使用 PHP 将 cURL POST 变量发送到另一个域。 SO cURL Questions
  • 等待其他域的响应
  • 向您的 AJAX 调用发送“yay”或“nay”

【讨论】:

  • "我无法在我自己的 php 文件中镜像请求"
  • @epascarello 哎呀,错过了那个花絮
【解决方案3】:

如果主要目标是让访问者留在您的网站上并将访问者输入提交给第三方网站,您可以将表单提交到执行 cUrl 到第三方网站的本地 php 脚本。

这样,数据在“水下”发布,而不向访问者显示所有发布参数,您可以将访问者留在自己的网站上。

唯一的问题是,您的支付提供商可能会根据支付结果(成功/失败/无法访问)将您重定向到不同的页面。

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 2011-05-01
    • 2021-07-29
    • 2012-04-25
    • 2011-08-20
    • 2018-11-10
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多