我有一个情况,我正在调用
fetch()
,如果响应是 302 重定向,我想将调用页面重定向到它重定向到的任何位置,而不是按照重定向来检索数据。
场景是用户在页面上执行某些操作,该页面将执行提取操作以检索要在页面上更新的内容。 但如果他们的登录会话已过期,服务器将返回 302 重定向到登录页面。 我的 Javascript 期望返回 JSON 响应,但
fetch
遵循重定向并获取 HTML 页面。
我真正想做的是检查response.status
是否为302,获取重定向指向的URL并设置window.location
。
根据文档,我应该能够设置
redirect: "manual"
,然后如果response.redirected
为true,则重定向到response.url
,或者有些人说从响应中检索location
标头
但是这些都不起作用。
response.redirected
从来都不是真的。response.status
为零。response.url
是发出调用的页面的 URL,而不是重定向到的页面。location
标头为空。唯一有效的是“网络”选项卡显示服务器返回了 302 状态。 这是我的代码:
fetch("url-that-forces-a-redirect", {
method: "POST",
redirect: "manual",
body: formData
}).then((response) => {
console.log("Response had status " + response.status);
if (response.redirected) {
var redirectedUrl = response.headers.get('location');
console.log("Got redirect: location header = " + redirectedUrl);
console.log(" response.url = " + response.url);
// window.location = redirectedUrl;
return;
}
});
有什么办法可以做到这一点吗?
顺便说一句,我首先尝试使用 XMLHttpRequest 执行此操作,但也找不到方法来执行此操作。
我认为这不是正确的方法。如果ajax页面发送http重定向状态,这意味着ajax被移动到另一个地方,而不是调用页面。
ajax 页面应该返回正确的 200 Ok 回复,并带有参数,您可以在 json 响应中决定名称,告诉调用页面进行重定向。
内页可以返回如下回复:
{status:"ok", forceRedirectTo: "http://www.page.com", ...}
外页可以测试:
if(reply.hasOwnProperty(forceRedirectTo)) { window.location =forceRedirectTo; }