IE10 将状态代码 401/403 解释为网络错误
IE10 interprets status codes 401/403 as network error
我有一个 AngularJS responseError
拦截器,它广播 401 和 403 HTTP 状态代码的事件。但是IE10(according to this)在从服务器获取到401状态码(未登录)或403(未授权)时存在一个bug,IE将此解释为网络错误,所以responseError
永远不会触发拦截器,因此永远不会将用户重定向到登录页面。
代码:
app.factory('authHttpInterceptor', ["$rootScope", "AUTH_EVENTS", "$q", function ($rootScope, AUTH_EVENTS, $q) {
return {
'request': function (config) {
return config;
},
'requestError': function (rejection) {
return $q.reject(rejection);
},
'response': function (response) {
return response;
},
'responseError': function (rejection) {
$rootScope.$broadcast({
401: AUTH_EVENTS.notAuthenticated,
403: AUTH_EVENTS.notAuthorized
}[rejection.status], rejection);
return $q.reject(rejection);
}
};
}]);
截图如下:
有解决办法吗?
编辑: response
拦截器被触发,我打算在那里检查状态是 401 还是 403,然后从那里广播它,但它只被触发如果响应成功 (200 OK)。
编辑 2: 结果是调用了 responseError
拦截器,但状态代码为 0
.
编辑 3: 我通过添加 0: AUTH_EVENTS.notAuthenticated,
来解决这个问题,因为如果我们收到 HTTP 状态代码 0,显然有问题。
这是一个 bug in Internet Explorer 10 并且被 Microsoft 关闭为 不可重现。该错误让 IE 将来自服务器的 401 状态代码解释为网络错误,因此无法确定用户是未经授权还是只是丢失了互联网连接。
我通过添加 0
作为错误事件解决了这个问题,因此当接收到状态代码 0
时,它会广播 notAuthenticated
事件。根据 RFC 2616 没有状态代码 0
所以当收到它时,意味着出了点问题。
我将拦截器更改为以下内容:
'responseError': function (rejection) {
$rootScope.$broadcast({
0: AUTH_EVENTS.notAuthenticated, // Edge case, if status code from server is 0, clearly something is wrong
401: AUTH_EVENTS.notAuthenticated,
403: AUTH_EVENTS.notAuthorized
}[rejection.status], rejection);
return $q.reject(rejection);
}
我有一个 AngularJS responseError
拦截器,它广播 401 和 403 HTTP 状态代码的事件。但是IE10(according to this)在从服务器获取到401状态码(未登录)或403(未授权)时存在一个bug,IE将此解释为网络错误,所以responseError
永远不会触发拦截器,因此永远不会将用户重定向到登录页面。
代码:
app.factory('authHttpInterceptor', ["$rootScope", "AUTH_EVENTS", "$q", function ($rootScope, AUTH_EVENTS, $q) {
return {
'request': function (config) {
return config;
},
'requestError': function (rejection) {
return $q.reject(rejection);
},
'response': function (response) {
return response;
},
'responseError': function (rejection) {
$rootScope.$broadcast({
401: AUTH_EVENTS.notAuthenticated,
403: AUTH_EVENTS.notAuthorized
}[rejection.status], rejection);
return $q.reject(rejection);
}
};
}]);
截图如下:
有解决办法吗?
编辑: response
拦截器被触发,我打算在那里检查状态是 401 还是 403,然后从那里广播它,但它只被触发如果响应成功 (200 OK)。
编辑 2: 结果是调用了 responseError
拦截器,但状态代码为 0
.
编辑 3: 我通过添加 0: AUTH_EVENTS.notAuthenticated,
来解决这个问题,因为如果我们收到 HTTP 状态代码 0,显然有问题。
这是一个 bug in Internet Explorer 10 并且被 Microsoft 关闭为 不可重现。该错误让 IE 将来自服务器的 401 状态代码解释为网络错误,因此无法确定用户是未经授权还是只是丢失了互联网连接。
我通过添加 0
作为错误事件解决了这个问题,因此当接收到状态代码 0
时,它会广播 notAuthenticated
事件。根据 RFC 2616 没有状态代码 0
所以当收到它时,意味着出了点问题。
我将拦截器更改为以下内容:
'responseError': function (rejection) {
$rootScope.$broadcast({
0: AUTH_EVENTS.notAuthenticated, // Edge case, if status code from server is 0, clearly something is wrong
401: AUTH_EVENTS.notAuthenticated,
403: AUTH_EVENTS.notAuthorized
}[rejection.status], rejection);
return $q.reject(rejection);
}