【问题标题】:A good way to redirect with a POST request?使用 POST 请求重定向的好方法?
【发布时间】:2011-02-05 23:11:51
【问题描述】:

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

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


有什么想法吗?

【问题讨论】:

  • 你能澄清你的意思吗?您想将 POST 数据发送/转发到另一台服务器吗?您希望用户浏览器在她发布请求后重定向?还有什么...?

标签: javascript html django redirect


【解决方案1】:

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

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

您可能还需要确保您重定向到的页面尚未接受 GET 参数。 一些脚本不分青红皂白地接受 GET 和 POST。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

      有点棘手,但三个选项:

      • 您的服务器接受 POST 数据,当用户等待响应时,您建立与另一台服务器的连接,发布数据,接收响应,然后向用户返回答案。
      • 您使用307 重定向来回答,这意味着用户应该在另一个地址尝试相同的请求。从理论上讲,这意味着浏览器应该将相同的数据发布到另一台服务器。我不太确定它的支持程度如何,但任何理解 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重定向会导致确认对话框出现。不确定早期版本。
    • 先生,服务器是否可以将传入的 GET 请求重定向到 POST 请求?具体如下:(1)用户点击一个超链接(例如News),(2)服务器通过发送一个响应(给用户)来重定向传入的GET请求,该响应将向服务器发送POST请求。它强制用户在点击超链接后立即发送 POST 请求。
    • @TheShortestMustacheTheorem No.
    • 非常感谢!
    • 第一:这是一个很好的答案。很多登陆这个页面的人(比如我!)想知道所有的可能性。根据我的经验,Web 浏览器中的 302303 会引发 HTTP GET 请求。我使用它来转换来自 SSO 身份验证服务的传入 POST 回复,然后通过 HTTP GET 重定向到最终 URL。
    【解决方案3】:

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

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

    <!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 保护;)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多