Angularjs保留会议

时间:2013-06-14 22:25:44

标签: angularjs

我正在使用asp.net webapi。身份验证是Thinktecture库的基本身份验证。

当用户登录时,用户名和密码将使用$CookieStore存储在会话cookie中。

我正在为每个获取请求的标头添加凭据,如下所示

$http.defaults.headers.common['Authorization'] = 'Basic '+$cookieStore.get('__RequestVerificationToken');

问题是,我必须在每次获取请求之前调用它。有没有一种方法可以让Angular自动将其添加到标题中,当响应为401时,用户应该自动重定向到登录页面。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用config在网站范围内设置http标头?:

var app = angular.module('myApp', []);
app.config(['$httpProvider', function($httpProvider, $cookieStore) {
  $httpProvider.defaults.headers.get['Authorization'] = 'Basic '+ $cookieStore.get('__RequestVerificationToken');
}]);

请注意,在我的示例中,我专门为GET次请求添加了默认授权标头。


关于问题的第二部分,您需要定义一个响应拦截器,它将捕获每个http响应,侦听401的状态代码并在发生时广播适当的事件(或直接重定向到登录页面): / p>

var app = angular.module('myApp', []);
app.config(['$httpProvider', '$location', function($httpProvider, $location){

    var interceptor = ['$rootScope', '$q', function($rootScope, $q) {
      var broadcasted;

        function success(response) {
        return response;
      }

      function error(response) {
        if (response.status === 401) {
          $rootScope.$broadcast('loginRequired');
          // or $location.url('/login');
          var deferred = $q.defer();
          return deferred.promise;
        }
        // otherwise
        return $q.reject(response);
      }

      return function(promise) {
        return promise.then(success, error);
      };

    }];

    $httpProvider.responseInterceptors.push(interceptor);
}]);