如何在每个控制器中为每个请求添加令牌 - Angular

时间:2016-06-16 09:59:35

标签: angularjs http

我认为我处理的是一些基本的东西,但我只能解决这个问题。

Angular Documentation I foundout选项中,如何为每个请求设置标头。它应该是这样的:

module.run(function($http) {
  $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';
});

这看起来是否从本例开始知道开头的令牌。但是我登录后会收到用户令牌。

所以我尝试了类似的东西:

login: function(email, password) {
    var data = {'userName':email, 'password': password};
    $http.post('api/v1/users/login.php', data).then(function (res) {
        $cookies.put('user', res.data);
        $http.defaults.headers.common.Authorization = 'Bearer '+res.data.token;
    });
}

现在为每个请求添加了Authorization标头,但只是在LoginCtrl中。如果我在没有这个标题的情况下在任何其他控制器中发出请求。

一旦我在其他控制器中创建其他$ http请求,我就需要它在那里工作。有没有一些很好的方法如何为每个控制器设置它,或者我必须在每个控制器从cookie加载时设置它?

2 个答案:

答案 0 :(得分:2)

Angular为您提供interceptors,可以处理来自您的应用程序的任何$ http调用。 看看这个documentation

示例

appName.config(["$httpProvider", ($httpProvider: ng.IHttpProvider) => {
                $httpProvider.interceptors.push(() => { 

                        return {
                            'request': (config) => {

                           //retrieving a token from localStorage for example
                               var token = localStorage.getItem("token"); 
                               if (token)
                                   config.headers["Authorization"] = "Bearer " + token;

                                return config;
                            },
                            'responseError': (rejection) => {

                            }
                        }
                    }
                );
            }]);

答案 1 :(得分:0)

首先,您已为每个控制器创建服务

module.run(function($http, $rootScope, subHeaderService) {
  subHeaderService.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';
  //subHeaderService.auth= 'Basic YmVlcDpib29w'; you can use like this
});

app.service('subHeaderService', function() {
    return {};
});

app.controller('mainCtrl', ['$scope', 'subHeaderService',
    //subHeaderService.auth     
    //call here 
]);

或者你可以使用拦截器。