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

时间:2010-04-09 01:18:49

标签: javascript html django redirect

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

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


有什么想法吗?

4 个答案:

答案 0 :(得分:32)

你的意思并不十分清楚,所以让我们采取一些方案:

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

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

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

    像往常一样轻松,接受并处理POST数据,然后使用302303重定向标题进行回复。

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

    有点棘手,但有三种选择:

    • 您的服务器接受POST数据,当用户等待响应时,您建立与另一台服务器的连接,发布数据,接收响应,然后向用户返回答案。
    • 您使用307重定向进行回答,这意味着用户应在其他地址尝试相同的请求。从理论上讲,它意味着浏览器应该将相同的数据POST到另一台服务器。我不太确定这是多么受支持,但任何了解HTTP1.1的浏览器都应该能够做到这一点。 AFAIA在实践中经常没有使用它。
      PS:规范说,307 POST重定向至少需要用户确认。唉,显然没有浏览器坚持这里的规范。 IE只是重复请求(因此它适用于您的目的),但Firefox,Safari和Opera似乎丢弃了POST数据。因此,遗憾的是,这种技术并不可靠。
    • 使用技术#1与隐藏的表单字段相结合,在其间添加一个步骤。
  4. 请在此处查看所有HTTP重定向选项的列表:http://en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection

答案 1 :(得分:4)

只需将HTML表单的操作网址设置为特定的外部网站即可。

这是一个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保护;)

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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

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