You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

咨询:如何在Angular中为所有HTTP请求设置access-token请求头

你的实现分析与更优方案推荐

Hey there! Let's take a look at your current implementation and talk about how we can make it better.

一、当前实现是否正确?

你的代码基本是可以正常工作的,但有几个小细节需要注意:

  • run块里设置$http.defaults.headers.common['access-token']是有效的,这会给所有HTTP请求自动带上这个请求头,不管是你在控制器里直接调用$http,还是在自定义服务里使用$http,都会生效。
  • 但你在自定义服务的get方法里又重复设置了access-token头,这其实是冗余的——既然全局已经配置过了,没必要再单独加一遍,虽然不会报错,但会增加不必要的代码量。
  • 另外要留意ACCESSTOKEN变量的作用域:如果它是全局变量、或者通过Angular的constant/value定义的,那没问题;但如果这个token是异步获取的(比如从登录接口返回后才拿到),那run块里的设置可能会因为时机问题,导致token还没获取到就已经执行了,这时候请求头里的token就是空的,会出问题。

二、更优的统一配置方案:HTTP拦截器

Angular官方更推荐用**HTTP拦截器(Interceptor)**来统一处理请求头,这种方式比直接设置defaults更灵活、扩展性更强。

1. 为什么用拦截器?

  • 避免重复代码:不用在每个自定义服务里手动添加token头,统一在拦截器里处理。
  • 灵活控制:可以根据请求的URL、方法等,决定是否添加token(比如某些公共接口不需要token,就可以跳过)。
  • 异常统一处理:比如后端返回401(未授权,token过期)时,可以统一跳转到登录页,或者自动刷新token。
  • 适配异步场景:如果token是异步获取的,拦截器可以更优雅地处理等待token就绪的逻辑。

2. 具体实现代码

第一步:定义Auth服务管理token

先封装一个专门的服务来存储和获取token,比直接用全局变量更安全,也符合Angular的依赖注入原则:

angular.module("MainModule")
.service('AuthService', function() {
  let accessToken = null;

  // 设置token
  this.setToken = function(newToken) {
    accessToken = newToken;
  };

  // 获取token
  this.getToken = function() {
    return accessToken;
  };
});

第二步:创建HTTP拦截器

angular.module("MainModule")
.factory('authInterceptor', function($q, AuthService) {
  return {
    // 拦截请求,添加token头
    request: function(config) {
      // 只有当token存在时才添加请求头
      const token = AuthService.getToken();
      if (token) {
        config.headers['access-token'] = token;
      }

      // 统一设置Content-Type(如果没有特殊需求的话)
      config.headers['Content-Type'] = config.headers['Content-Type'] || 'application/json';
      
      return config || $q.when(config);
    },

    // 拦截响应错误,处理token过期等情况
    responseError: function(rejection) {
      // 比如后端返回401,说明token失效,跳转到登录页
      if (rejection.status === 401) {
        // 这里可以添加清除token、跳转登录的逻辑
        window.location.href = '/login';
      }
      return $q.reject(rejection);
    }
  };
});

第三步:注册拦截器到$httpProvider

在模块的config阶段把拦截器注册进去:

angular.module("MainModule", ["ngRoute"])
.config(function($httpProvider) {
  // 添加拦截器
  $httpProvider.interceptors.push('authInterceptor');
});

3. 调整自定义服务

现在你的自定义服务里就不需要再手动设置access-tokenContent-Type了,简化后的代码:

service.get = function(x) {
  console.log(AuthService.getToken());
  return $http({
    method: "GET",
    crossDomain: true,
    url: GETSERVICE.replace("{id}", x),
    dataType: 'json'
  }).then(function(response) {
    // 处理响应逻辑
  });
};

补充注意事项

  • 关于crossDomain: true:如果你的后端已经正确配置了CORS(跨域资源共享),Angular会自动处理跨域请求,不需要手动设置这个属性,除非有特殊的跨域场景需求。
  • 异步获取token的场景:如果token是登录后才拿到的,只需要在登录成功后调用AuthService.setToken(返回的token),后续所有请求都会自动带上这个token,不需要再修改其他代码。

内容的提问来源于stack exchange,提问作者Daveus

火山引擎 最新活动