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);
}