使用 POST 请求重定向的好方法?

IT技术 javascript html django redirect
2021-03-01 02:42:00

我需要通过 POST 请求将用户重定向到外部站点。

我想出的唯一选择是通过 JavaScript 提交表单。


有任何想法吗?

4个回答

不太清楚你的意思,所以让我们假设几个场景:

  1. 用户应将表单 POST 到您自己以外的服务器

    很简单,只需将目标指定为表单操作:

    <form action="http://someotherserver.com" method="post">
    
  2. 用户应该在成功的 POST 提交后重定向

    很简单,像往常一样接受和处理 POST 数据,然后用一个302303重定向头响应

  3. 用户应将数据 POST 到您的服务器,并在验证后将该数据 POST 到另一台服务器

    有点棘手,但三个选项:

    • 您的服务器接受 POST 数据,当用户等待响应时,您建立到另一台服务器的连接,POST 数据,接收响应,然后将答案返回给用户。
    • 您使用307重定向回答,这意味着用户应该在另一个地址尝试相同的请求。从理论上讲,这意味着浏览器应该将相同的数据 POST 到另一台服务器。我不太确定这有多受支持,但任何理解 HTTP1.1 的浏览器都应该能够做到。AFAIA 它在实践中并不经常使用。
      PS:规范说 307 POST 重定向至少需要得到用户的确认。唉,显然没有浏览器坚持这里的规范。IE 只是重复请求(因此它可以满足您的目的),但 Firefox、Safari 和 Opera 似乎丢弃了 POST 数据。因此,不幸的是,这种技术是不可靠的。
    • 使用技术#1 结合隐藏的表单字段,在两者之间添加一个步骤。

有关所有 HTTP 重定向选项的列表,请参见此处:http : //en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection

我碰巧知道 FF19 上的 307 重定向会导致确认对话框出现。不确定早期版本。
2021-04-24 02:42:00
非常感谢你!
2021-04-30 02:42:00
第一:这是一个很好的答案。许多登陆此页面的人(像我一样!)想知道所有的可能性。根据我的经验,302303在Web浏览器会导致HTTP GET请求。我使用它来转换来自 SSO 身份验证服务的传入 POST 回复,然后通过 HTTP GET 重定向到最终 URL。
2021-05-08 02:42:00
@TheShortestMustacheTheorem 没有。
2021-05-09 02:42:00
先生,服务器可以将传入的 GET 请求重定向到 POST 请求吗?详细信息如下: (1) 用户单击超链接(News例如), (2) 服务器通过发送响应(向用户)重定向传入的 GET 请求,该响应将向服务器发送 POST 请求。它强制用户在单击超链接后立即发送 POST 请求。
2021-05-17 02:42:00

只需将 HTML 表单的操作 URL 设置为特定的外部站点。

这是一个SSCCE,只需复制'n'paste'n'run它:

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2604530</title>
    </head>
    <body>
        <form action="http://stackoverflow.com/questions/2604530/answer/submit" method="post">
            <textarea name="post-text"></textarea>
            <input type="submit" value="Post Your Answer">
        </form>
    </body>
</html>

你会看到 Stackoverflow 有很好的 CSRF 保护;)

Javascript 是唯一的方法(自动执行)。您根本无法POST通过标准http方法重定向请求你确定这GET不是一个选项吗?

使用表单可能是作为链接、HTTP 重定向的唯一选择,并且<meta http-equiv="refresh" >只会导致浏览器使用GET方法加载另一个 URL

不过,您不一定必须使用 JavaScript 来提交表单。如果某些用户交互是可以接受的,您可以使用带有某些<input type="hidden">字段的表单并让用户按下提交按钮。

您可能还想确保您重定向到的页面尚未接受 GET 参数。一些脚本不加区别地接受 GET 和 POST。