AngularJS有种机制叫做拦截器(interceptor),它是$http扩展点,类似ASP.NET MVC的过滤器filter机制,对每个$http请求的发送和接收过程进行过滤。

  $httpProvider 中有一个 interceptors 数组,定义一个工厂服务,并添加到该数组中。

 module.config(['$httpProvider', function($httpProvider) {

    $httpProvider.interceptors.push('myInterceptor');

  }]);

  定义factory,返回一个对象,有属性request,requestError,response,responseError属性,对每个请求及其进行统一处理,对每次请求都添加上身份认证信息,构造附加的请求地址前缀等,对响应如果有错误或异常,进行统一处理,或弹出对话框。

module.factory('myInterceptor',
['$q', '$log', '$injector', 'loginContext', 'eventAggregator', 'maintainUtil',
function ($q, $log, $injector, loginContext, eventAggregator, maintainUtil) {
'use strict'; var apiToken = loginContext.apiToken;
var tokenType = loginContext.tokenType;
var webApiHostUrl = loginContext.apiHost + "/api/v1"; return {
//token save to services for further usage
tokenType: tokenType,
apiToken: apiToken,
webApiHostUrl: webApiHostUrl, // On request success
request: function (config) {
if (config.isWebApiRequest && !config.isPlugin) {
config.url = (config.mkApiUrl || webApiHostUrl) + config.url;
config.headers = config.headers || {};
config.headers.Authorization = tokenType + ' ' + (config.mkToken || apiToken);
var specificOfficeId = Mres.specificOfficeUtil.getOfficeId();
if (specificOfficeId) {
config.headers["specific-office-id"] = specificOfficeId;
}
} else if (config.handleApiRequest) {
config = config.handleApiRequest(config);
}
return config;
},
// On request failure
requestError: function (rejection) {
$log.error(rejection); // Contains the data about the error on the request.
// Return the promise rejection.
return $q.reject(rejection);
},
// On response failture
responseError: function (response) {
$log.error(response); // Contains the data about the error.
if (response.status === 401) {
//window.location = '/logoff';
Mres.logOff();
} else if (response.data) {
if (response.data.name == 'MenantInactiveException') { aresMaintainUtil.goToMenantInactivePage();
}
eventAggregator.publish(eventAggregator.events.ApiErrorHappened, response, 'myInterceptor');
} else if (response.status === 0) {
var isSaasApi = true;
if (response.config && response.config.url.indexOf('//marketcenter') > -1) {
isSaasApi = false;
}
if (isSaasApi) {
aresMaintainUtil.ensureInMaintainMode().then(function (isInMaintainMode) {
if (isInMaintainMode) {
mresMaintainUtil.goToMaintainPage();
}
});
}
}
// Return the promise rejection.
return $q.reject(response);
}
};
}])

  适用于对每次请求和响应附加统一功能或数据。

最新文章

  1. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
  2. 拯救无法启动的虚拟机文件.vmdk中的数据
  3. c语言第2次作业
  4. 自增序号,而且默认变量就是$i,也就是说在你的volist标签之内,可以直接使用$i
  5. mysql的timeout
  6. http之错误码
  7. java基础--java静态代码块和静态方法的区别、static用法
  8. linux 下的clock_gettime() 获取精确时间函数
  9. Firefox 23中的新特性(新陷阱)
  10. Windows路由表详解
  11. struts2初印象
  12. Java 面试总结(一) —— 面试常问的关键字总结
  13. 利用PowerDesigner15在win7系统下对MySQL 进行反向工程(三)
  14. Jenkins可用环境变量以及使用方法
  15. CF1103D Professional layer dp
  16. ORA-16038 ORA-19809 ORA-00312
  17. Zookeeper常用操作命令create,set,delete
  18. Docker删除镜像
  19. 理解 IntelliJ IDEA 的项目配置和Web部署(转载)
  20. C# Datatable排序(转)

热门文章

  1. spring自动注解Autowired配置
  2. 第一个ASP.NET Web API (C#)程序
  3. 当前页面刷新和动态添加控件的jquery事件绑定on
  4. 【机器学习】感知机学习算法(PLA)
  5. Tarjan 割点,桥
  6. 团队-Python 爬取豆瓣电影top250-成员简介及分工
  7. MySQL基准测试--innodb_buffer_pool_instances
  8. Django的学习(二)————Templates
  9. php使用include报错require_once(../include.php): failed to open stream: No such file or directo
  10. php 操作redis 以及几个常用命令