获取后调用后重定向

zap*_*pee 21 redirect fetch reactjs

我正在创建一个带有访问管理(AM)服务器的社交登录页面.当用户单击登录按钮时,我会对AM服务器进行提取http调用.AM服务器生成带有auth cookie的HTTP 301重定向响应到社交登录页面.我需要以某种方式关注此重定向响应并在Web浏览器中显示新内容.

UI: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=...
Run Code Online (Sandbox Code Playgroud)

响应

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

反应代码:

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

我如何遵循重定向响应并在Web浏览器中显示新内容?

Max*_*888 35

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

fetch(url, { method: 'POST', redirect: "follow" });
Run Code Online (Sandbox Code Playgroud)

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

  • @janat08 不幸的是,我认为没有解决方案。 (9认同)
  • 这更像是应该得到的答案,但你没有提供解决方案。 (3认同)

Shu*_*tri 19

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

如果是"follow",则fetch()API遵循重定向响应(HTTP状态代码= 301,302,303,307,308).

如果是"error",则fetch()API会将重定向响应视为错误.

如果是"手动",则fetch()API不会遵循重定向,并返回包含重定向响应的opaque-redirect过滤响应.

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

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

  • 上面的cors set代码不会自动重定向.但我确实在Chrome版本61.0.3163.100(官方版本)的网络标签中看到了新网址.知道为什么浏览器没有渲染它. (19认同)
  • `error` 也是无用的,因为它只抛出一个错误,但无法访问重定向响应 (7认同)
  • 这根本不起作用,不执行重定向。您甚至无法访问“location”标头来手动重定向!不敢相信遵循 302 是多么困难! (6认同)
  • @BenKoshy 不,不是。@Luke T O'Brien `manual` 返回一个不透明的响应,以便服务工作人员重播响应。这是一个零字节、无法访问、基本上无法使用的响应。不是你想要的。“错误”可能更有用 (3认同)
  • 重定向的问题:“关注”是我需要在浏览器中显示页面。因此,我需要以某种方式重定向浏览器并显示新内容。 (2认同)
  • - 重定向的问题:“跟随”是我需要在浏览器中显示页面。在这种情况下,我认为使用“manual”,然后使用[Location header](https://developer.mozilla.org/en-US/docs/Web/)设置“location.href”甚至“window.open”返回响应的 HTTP/Headers/Location) (2认同)

van*_*ars 5

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

例如,请参阅:如何在 jQuery Ajax 调用后管理重定向请求

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

  • 从 Chrome 版本 61.0.3163.100(官方版本)开始 --> 它确实返回一个“重定向”标志、一个 url 和 200 状态 尽管将“重定向”设置为“跟随”--> 它不会自行重定向,而且我需要使用window.location (2认同)

And*_*ver 5

看一下响应对象重定向的属性URL :Doc说这是

“实验性的。希望将来的行为会改变”

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

在我的实验中,此“ url”属性与Chrome(版本75.0.3770.100(正式版本)(64位))网络控制台中的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);
    });
Run Code Online (Sandbox Code Playgroud)

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

PS在SPA应用程序中,不太可能进行重定向响应,这也许就是ajax供应商对该功能很少关注的原因。又见这些讨论: 这里 这里

  • 我遵循了这种方法,但请记住,这会向“response.url”发出 2 个单独的请求。只需查看网络选项卡即可。 (3认同)
  • 似乎没有加载响应,我的 api 在评估帖子后提供了一些闪存消息。 (2认同)