【发布时间】:2011-02-05 23:11:51
【问题描述】:
我需要通过 POST 请求将用户重定向到外部站点。
我想出的唯一选择是通过 JavaScript 提交表单。
有什么想法吗?
【问题讨论】:
-
你能澄清你的意思吗?您想将 POST 数据发送/转发到另一台服务器吗?您希望用户浏览器在她发布请求后重定向?还有什么...?
标签: javascript html django redirect
我需要通过 POST 请求将用户重定向到外部站点。
我想出的唯一选择是通过 JavaScript 提交表单。
有什么想法吗?
【问题讨论】:
标签: javascript html django redirect
使用表单可能是您唯一的选择,因为链接、HTTP 重定向和<meta http-equiv="refresh" > 只会导致浏览器使用 GET 方法加载另一个 URL。
您不一定必须使用 JavaScript 来提交表单。如果某些用户交互是可以接受的,您可以使用带有一些 <input type="hidden"> 字段的表单并让用户按下提交按钮。
您可能还需要确保您重定向到的页面尚未接受 GET 参数。 一些脚本不分青红皂白地接受 GET 和 POST。
【讨论】:
不太清楚你的意思,所以让我们来看看几个场景:
用户应将表单发布到您自己以外的服务器
简单,只需将目标指定为表单动作:
<form action="http://someotherserver.com" method="post">
POST 提交成功后用户应该被重定向
很简单,像往常一样接受和处理 POST 数据,然后使用 302 或 303 重定向标头进行响应。
用户应将数据 POST 到您的服务器,并且在验证后,您希望将该数据 POST 到另一台服务器
有点棘手,但三个选项:
307 重定向来回答,这意味着用户应该在另一个地址尝试相同的请求。从理论上讲,这意味着浏览器应该将相同的数据发布到另一台服务器。我不太确定它的支持程度如何,但任何理解 HTTP1.1 的浏览器都应该能够做到。 AFAIA 在实践中并不经常使用它。有关所有 HTTP 重定向选项的列表,请参见此处:http://en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection
【讨论】:
News),(2)服务器通过发送一个响应(给用户)来重定向传入的GET请求,该响应将向服务器发送POST请求。它强制用户在点击超链接后立即发送 POST 请求。
302 和 303 会引发 HTTP GET 请求。我使用它来转换来自 SSO 身份验证服务的传入 POST 回复,然后通过 HTTP GET 重定向到最终 URL。
只需将 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 保护;)
【讨论】:
Javascript 是唯一的方法(自动执行)。您根本无法通过标准的http 方法重定向POST 请求。你确定GET 不是这里的选项吗?
【讨论】: