【问题标题】:redirect after a fetch post call在获取帖子调用后重定向
【发布时间】:2017-02-05 17:23:57
【问题描述】:

我正在使用访问管理 (AM) 服务器创建社交登录页面。 当用户单击登录按钮时,我对 AM 服务器进行 fetch http post 调用。 AM 服务器生成带有身份验证 cookie 的 HTTP 301 重定向响应到社交登录页面。我需要以某种方式遵循此重定向响应并在 Web 浏览器中显示新内容。

用户界面:ReactJS

请求:

POST /api/auth/socialauth/initiate HTTP/1.1
Host    example.com
User-Agent  Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0)
Accept  */*
Accept-Language en-US,en;q=0.5
Accept-Encoding gzip, deflate
origin  http://web.example.com:8080
Referer http://web.example.com:8080/myapp/login
Cookie  authId=...; NTID=...

回应

HTTP/1.1 307 Temporary Redirect
https://www.facebook.com/dialog/oauth?client_id=...&scope=public_profile%2Cemail&redirect_uri=http%3A%2F%2Fam.example.com%3A8083%2Fopenam%2Foauth2c%2FOAuthProxy.jsp&response_type=code&state=qtrwtidnwdpbft4ctj2e9mv3mjkifqo

反应代码:

initiateSocialLogin() {
    var url = "/api/auth/socialauth/initiate";

    fetch(url, { method: 'POST' })
        .then(response => {
            // HTTP 301 response
            // HOW CAN I FOLLOW THE HTTP REDIRECT RESPONSE?
        })
        .catch(function(err) {
            console.info(err + " url: " + url);
        });
}

如何跟踪重定向响应并在网络浏览器中显示新内容?

【问题讨论】:

  • 你可以让fetch自动重定向,把fetch(url, { method: 'POST' })改成fetch(url, { method: 'POST', redirect: 'follow' })

标签: redirect reactjs fetch


【解决方案1】:

Request.redirect 可以是"follow""error""manual"

如果是“follow”,fetch() API 会跟随重定向响应(HTTP 状态码 = 301,302,303,307,308)。

如果是“错误”,则 fetch() API 将重定向响应视为 错误。

如果是“手动”,则 fetch() API 不遵循重定向并返回 包含重定向的不透明重定向过滤响应 回应。

由于您想在获取后重定向,只需将其用作

fetch(url, { method: 'POST', redirect: 'follow'})
    .then(response => {
        // HTTP 301 response
    })
    .catch(function(err) {
        console.info(err + " url: " + url);
    });

【讨论】:

  • redirect: 'follow' 的问题是我需要在浏览器中显示页面。所以我需要以某种方式重定向浏览器并显示新内容。
  • 上面设置了 cors 的代码不会自动重定向。但我确实在 Chrome 版本 61.0.3163.100(官方版本)的网络选项卡中看到了新的 URL。知道为什么浏览器不呈现它。
  • - redirect: 'follow' 的问题是我需要在浏览器中显示页面。在这种情况下,我认为使用manual,然后使用返回响应的Location header 设置location.href 甚至window.open
  • @BenKoshy 不,不是。 @Luke T O'Brien manual 返回一个不透明的响应,供服务人员重播响应。它是一个零字节、无法访问、基本上无法使用的响应。不是你想要的。 error 可能更有用
  • error 也无用,因为它只会抛出错误,但无法访问重定向响应
【解决方案2】:

查看 Response 对象的属性urlredirected: 医生说这是

“实验性。预计未来行为会发生变化”

Response接口的url只读属性包含URL 的回应。 url 属性的值将是最终 URL 在任何重定向后获得。

在我的实验中,这个 'url' 属性与 Chrome (Version 75.0.3770.100 (Official Build) (64-bit)) 网络控制台中 Location 标头的值完全相同。

处理重定向链接的代码如下所示:

   fetch(url, { method: 'POST' })
    .then(response => {
        // HTTP 301 response
        // HOW CAN I FOLLOW THE HTTP REDIRECT RESPONSE?
        if (response.redirected) {
            window.location.href = response.url;
        }
    })
    .catch(function(err) {
        console.info(err + " url: " + url);
    });

我测试了它与 react.js 同源脚本一起使用,并从服务器获取面向重定向 302 的 AJAX 调用。

P.S. 在 SPA 应用程序中,重定向响应不太可能,这可能是 ajax 供应商很少关注此功能的原因。 另见这些讨论: here here

【讨论】:

  • 似乎没有加载响应,我的 api 在评估帖子后提供了一些 Flash 消息。
  • 我采用了这种方法,但请记住,这会向 response.url 发出 2 个单独的请求。只需查看网络标签。
  • 为什么会发出两个请求?
  • @stevemoretz:一个用于获取您的帖子请求,另一个用于实际重定向到页面。
  • 哦,window.location.href 部分很酷!
【解决方案3】:

无法使用 javascript 重定向到新的 HTML 页面。

fetch(url, { method: 'POST', redirect: "follow" });

将简单地对重定向的位置执行另一个请求,该请求将作为数据返回,而不是由浏览器呈现。您可能希望能够使用{ redirect : "manual" },从响应中获取重定向的位置并使用Javascript 导航到页面,但不幸的是重定向的位置没有返回,请参阅https://github.com/whatwg/fetch/issues/763

【讨论】:

  • 这更像是答案,但您没有提供解决方案。
  • @janat08 不幸的是,我认为没有解决方案。
【解决方案4】:

我有一个类似的问题,我相信 React 中 fetch 的答案与 JQuery 中 ajax 的答案相同 - 如果您能够检测到响应是重定向,则更新 window.location.href与 response.url

例如:How to manage a redirect request after a jQuery Ajax call

请注意,“如果您能够检测到响应是重定向”可能是棘手的部分。获取响应可能包含“重定向”标志(请参阅https://developer.mozilla.org/en-US/docs/Web/API/Response),但我发现 Chrome 中并非如此。我还发现在 Chrome 中我得到 200 状态响应而不是重定向状态 - 但这可能与我们的 SSO 实现有关。如果您在 IE 中使用 fetch polyfill,则需要检查是否包含 response.url。

【讨论】:

  • 从 Chrome 版本 61.0.3163.100 (Official Build) --> 它返回一个“redirected”标志和一个 url 和 200 状态并且尽管将“redirect”设置为“follow”-- > 它不会自行重定向,我需要使用 window.location
  • window.location 将发出一个新请求,总共提供 2 个 @j10。知道什么是正确的方法,但这里没有一个答案是正确的
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多