gpt4 book ai didi

angularjs - 在 angularjs 中处理来自代理的 HTTP 302 响应

转载 作者:行者123 更新时间:2023-12-03 07:59:39 25 4
gpt4 key购买 nike

我有一个反向代理,可以检查多个应用程序的全局身份验证。当用户断开连接但仍在尝试使用我的应用程序时,代理会发送 302 响应:

HTTP/1.1 302 Found
Date: Wed, 11 Sep 2013 09:05:34 GMT
Cache-Control: no-store
Location: https://other.url.com/globalLoginPage.html
Content-Length: 561
Content-Type: text/html; charset=iso-8859-1
Via: 1.1 my-proxy.com
Connection: Keep-Alive

在 angularJs 中,错误回调被调用,但响应头为空,状态为 0,数据为空字符串。所以看起来我真的无能为力来处理响应......
我已经看到有关该主题的几个问题,但我仍然不明白发生了什么(CORS 因为代理或位置不同的域?,302 浏览器行为?)。
特别是答案中的这一部分( https://stackoverflow.com/a/17903447/1093925 ):

Note: If your server sets a response code of 301 or 302, you will not be able to get the Location header, as it will be automatically and transparently followed by the XMLHttpRequest object.



这个 XMLHttpRequest 对象怎么样?
在非常旧的 Chrome 版本(不能使用较新版本)中,我可以在网络面板中看到相应的请求,但由于没有响应,它似乎失败了。
在最新版本的 Firefox 中,什么也没有发生。

由于我无法更改代理配置和响应,我可以对此做些什么吗?

更新:
我今天重播了我的场景,多亏了更新版本的 Firebug ,我能够获得更多关于正在发生的事情的细节。
在我的问题中,我离答案不远:跨域策略。
由于它是我的应用程序发出的 HTTP 请求,浏览器拒绝以下 XMLHttpRequest(应用程序内看起来像相同的请求)。因此出现错误和空响应。
所以我觉得没有什么特别我可以做的

最佳答案

我在我的应用程序中遇到了同样的问题。
您无法真正“捕获” 302 重定向响应。浏览器会在 Angular 得到它之前捕获它。所以实际上,当你收到你的回复时——已经太晚了。

坏消息 : 在angular平台上不是问题。 xmlHttpRequest 不支持这种行为,浏览器会在您对此做任何事情之前采取行动。
引用:Prevent redirection of Xmlhttprequest

好消息 :有很多方法可以绕过这个问题,通过拦截响应 - 并找到一些方法来识别它是你可爱的 302。这是一个 hack,但它是你目前能做的最好的。

所以。
例如,在我的应用程序中,重定向返回到应用程序的 login.html 页面,在应用程序中我得到了状态为 200 的响应,响应数据是我的 login.html 页面的内容。
所以在我的拦截器中,我检查了结果是否是一个字符串(通常不是!所以 - 没有效率问题..),如果是 - 检查它是否是我的 login.html 页面。这样,我就可以捕获重定向并按照我的方式处理它。

yourApp.factory('redirectInterceptor', ['$location', '$q', function($location, $q) {
return function(promise) {
promise.then(
function(response) {
if (typeof response.data === 'string') {
if (response.data.indexOf instanceof Function &&
response.data.indexOf('<html id="ng-app" ng-app="loginApp">') != -1) {
$location.path("/logout");
window.location = url + "logout"; // just in case
}
}
return response;
},
function(response) {
return $q.reject(response);
}
);
return promise;
};
}]);

然后将此拦截器插入您的应用程序。像这样:
$httpProvider.responseInterceptors.push('redirectInterceptor');

祝你好运。

关于angularjs - 在 angularjs 中处理来自代理的 HTTP 302 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18737674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com