防止在没有ajax的情况下提交后重定向表单


Prevent form redirect after submit without ajax

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

那么,有没有任何方法可以在不使用ajax的情况下提交表单,但防止重定向。正如我所知,使用ajax不可能向不同的域发出请求。

解决方案1

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

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

从ajax调用return false或调用preventDefault()以阻止浏览器重定向页面。

解决方案2

提交给您自己的服务器端代码并模拟事务。然而,你提到他们不允许你镜像它,我也没有解决这个问题的细节。您可以向自己的服务器提交AJAX(没有CORS问题,也没有必要的头)或普通POST。

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

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

新建

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

因此,逻辑是:

  • 有一个空的<div>display:none;
  • 拥有<form action='self.php'>
  • 提交并preventDefault()
  • 使用查询字符串生成URL
    • 最好是完全不同的页面newself.php?var1=something&var2=anotherthing
  • 使用URL+querystring将<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将POST变量cURL到其他域。SO cURL问题
  • 等待来自其他域的响应
  • 向AJAX调用返回"是"或"否"

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

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

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