AngularJS AOP 实例
2024-10-10 04:30:09
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);
}
};
}])
适用于对每次请求和响应附加统一功能或数据。
最新文章
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
- 拯救无法启动的虚拟机文件.vmdk中的数据
- c语言第2次作业
- 自增序号,而且默认变量就是$i,也就是说在你的volist标签之内,可以直接使用$i
- mysql的timeout
- http之错误码
- java基础--java静态代码块和静态方法的区别、static用法
- linux 下的clock_gettime() 获取精确时间函数
- Firefox 23中的新特性(新陷阱)
- Windows路由表详解
- struts2初印象
- Java 面试总结(一) —— 面试常问的关键字总结
- 利用PowerDesigner15在win7系统下对MySQL 进行反向工程(三)
- Jenkins可用环境变量以及使用方法
- CF1103D Professional layer dp
- ORA-16038 ORA-19809 ORA-00312
- Zookeeper常用操作命令create,set,delete
- Docker删除镜像
- 理解 IntelliJ IDEA 的项目配置和Web部署(转载)
- C# Datatable排序(转)
热门文章
- spring自动注解Autowired配置
- 第一个ASP.NET Web API (C#)程序
- 当前页面刷新和动态添加控件的jquery事件绑定on
- 【机器学习】感知机学习算法(PLA)
- Tarjan 割点,桥
- 团队-Python 爬取豆瓣电影top250-成员简介及分工
- MySQL基准测试--innodb_buffer_pool_instances
- Django的学习(二)————Templates
- php使用include报错require_once(../include.php): failed to open stream: No such file or directo
- php 操作redis 以及几个常用命令