WebAPI在登录超时时向我发送了一个完整的HTML页面.如何在AngularJS中使用此响应

WebAPI is sending me a whole HTML page on login timeout. How to use this response in AngularJS?

本文关键字:页面 HTML 响应 AngularJS 超时 登录 WebAPI 一个      更新时间:2023-09-26

我有以下代码来调用我正在开发的业务应用程序客户端的服务(后端有.NET WebAPI):

resource = $resource(apiEndPointManager.endpoints.masterValues, {}, {  
    GetByCode: {
                url: '{0}/:code'.format(apiEndPointManager.endpoints.masterValues),
                method: 'GET',
                transformResponse: function(data) {
                    var response = angular.fromJson(data);
                    if (response.length) {
                        // the response is an array, so convert it into an object
                        var object = {};
                        for( var i = 0; i < response.length; i ++) {
                            object[i] = response[i];
                        }
                        return object;
                    } else {
                        return response;
                    }
                }
            },

当我登录时,该服务运行良好,data变量中填充了我需要的json数据。但是,如果超时,data变量将填充一个完整的HTML页面(更具体地说是登录调度页面)。

我不知道我应该如何处理这种情况,并正确地重定向到AngularJS中的那个页面。做到这一点的最佳做法是什么?

感谢

最后,我通过创建一个捕获响应的特殊拦截器来解决问题,如果响应是HTML页面,则执行重定向到登录页面。

resource = $resource(apiEndPointManager.endpoints.masterValues, {}, {  
    GetByCode: {
            url: '{0}/:code'.format(apiEndPointManager.endpoints.masterValues),
            method: 'GET',
            interceptor: resourceResponseInterceptor
    }

拦截器:

angular.module('app.services')
.factory('resourceResponseInterceptor', ['$rootScope', '$q', '$injector', function ($rootScope, $q, $injector) {
    var userContext = $injector.get('$userContext');
    return {
        response: function (response) {
            // when session is already timed out, Siteminder will return the login page with an OK code
            // so check that response is HTML and if it is redirect user to the Dispatch page
            if ($.isHtmlResponseContent(response)) {
                window.location.href = userContext.data.LogoutUrl;
                return $q.reject(response);
            }
            return response.resource;
        }
    };
}]);
$.isHtmlResponseContent = function(response) {
    var isHtmlContent = false;
    var contentType = response.headers('Content-Type');
    if (contentType) {
        isHtmlContent = contentType.indexOf('text/html') >= 0;
    }
    return isHtmlContent;
};

希望它能帮助有同样问题的人!