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

Rad*_*Hex 16 html javascript django redirect

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

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


有任何想法吗?

dec*_*eze 34

目前还不是很清楚你的意思,所以让我们采取一些场景:

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

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

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

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

  3. 用户应将数据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


Wol*_*lph 6

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


Bal*_*usC 5

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

这是一个SSCCE,只需复制“ 粘贴 ”即可运行它:

<!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>
Run Code Online (Sandbox Code Playgroud)

您会看到Stackoverflow具有良好的CSRF保护;)


Ale*_*min 1

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

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

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