如何将拦截器拆分为不同的请求(URL)?

水獭

最初,我有configAuth头文件,包括每个Controller的JWT令牌。

var configAuth = {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': localStorage.getItem('token')
    }
};

但是现在,当我拥有大量控制器时,我意识到我需要为此做些事情。我听说过interceptors并且想让他们。

我知道我不能只对每个请求都添加令牌,因为有些页面和类似的请求/login根本不应该包含Authorization令牌。与html文件一起Authorization header以某种方式给了我一个例外。所以我试图像这样拆分请求:

angular.module('App')

.factory('sessionInjector',['$injector', function ($injector) {
    var sessionInjector = {
        request: function (config) {
            if (config.url == "/one" || config.url == "/two"){
                config.headers['Content-Type'] = 'application/json;charset=utf-8;';
                config.headers['Authorization'] = localStorage.getItem('token');
            } else {
                config.headers['Content-Type'] = 'application/json;charset=utf-8;';
            }
            return config;
        },
        response: function(response) {
            if (response.status === 401) {
                var stateService = $injector.get('$state');
                stateService.go('login');
            }
            return response || $q.when(response);
        }
    };
    return sessionInjector;
}]);

但这不适用于类似的请求,/one/{one_id}而且我无法对所有可能性进行硬编码。那么,最佳实践是什么?

德里克MT12

您现在拥有的是一个很好的起点。我假设您的大多数API都需要auth令牌,所以设置哪些端点不需要auth可能是更快的方法。我尚未对此进行测试,但这可能会让您步入正轨。我将您的注入器设置为提供程序,因此您可以在配置中配置匿名路由规则。

angular.module('App')
    .provider('sessionInjector',[function () {
        var _anonymousRouteRules;

        this.$get = ['$injector', getSessionInjector];
        this.setupAnonymousRouteRules = setupAnonymousRouteRules;

        function getSessionInjector($injector) {
            var service = {
                request: requestTransform,
                response: responseTransform
            };

            function requestTransform(config) {         
                if (!isAnonymousRoute(config.url)){
                    config.headers['Authorization'] = localStorage.getItem('token');
                }

                config.headers['Content-Type'] = 'application/json;charset=utf-8;';

                return config;
            }

            function responseTransform(response) {
                if (response.status === 401) {
                    var stateService = $injector.get('$state');
                    stateService.go('login');
                }
                return response || $q.when(response);
            }

            return service;
        }

        function isAnonymousRoute(url) {
            var isAnonymous = false;
            angular.forEach(_anonymousRouteRules, function(rule) {
                if(rule.test(url)) {
                    isAnonymous = true;
                }
            });
            return isAnonymous;
        }

        function setupAnonymousRouteRules(anonymousRouteRules) {
            _anonymousRouteRules = anonymousRouteRules;
        }
    }]);

这样,您可以通过为URL传入一组正则表达式来配​​置规则:

angular.module('App').config(['sessionInjectorProvider', config]);

function config(sessionInjectorProvider) {
    sessionInjectorProvider.setupAnonymousRouteRules([
        /.*\.html$/,
        /^\/login$/
    ]);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将标头添加到OkHttp请求拦截器?

如何在拦截器中发送不同的请求?

Angular 5 HttpClient:如何将拦截器设置为仅通过 RegExp 过滤的 URL

JEE:如何将参数传递给拦截器

角度错误拦截器,在不同的URL上重试原始请求

万一拦截器发生错误,如何将控件从拦截器重定向到jsp

如何将expressJS服务器代码拆分为不同的文件

CDI拦截器与servlet中的当前请求不同

Axios:如何正确取消请求拦截器中的请求?

如何将整数数组拆分为不同的格式

如何将 Pytorch 张量拆分为不同的维度?

如何将代码拆分为不同的python文件

GIT如何将提交从分支拆分为不同的分支?

如何将列拆分为不同的向量

在Angular请求拦截器上获取先前的URL

如何将数据从gRPC拦截器传递到服务方法调用?

如何将 AWS Cognito 令牌添加到 Angular Http 拦截器

如何将方法拦截器绑定到提供程序?

如何将axios / axios拦截器全局连接到Nuxt?

如何将FacesMessage添加到CDI安全拦截器?

NestJS:如何将ClassSerializerInterceptor设置为全局拦截器

如何将URL拆分为字符串数组

如何在gRPC拦截器中访问消息请求?

http拦截器如何为发出的每个请求创建?

如何使用Jersey拦截器获取请求正文

如何使用HTTP拦截器发出HTTP请求

如何在SwaggerUIBundle中设置请求拦截器?

如何在 $.ajaxSetup ajax 拦截器中获取 URL

如何阻止广告拦截器拦截?