Angular $http拦截器介绍与使用
什么是拦截器顾名思义,拦截器就是在目标达到目的地之前对其进行处理以便处理结果更加符合我们的预期。Angular的$http拦截器是通过 实现拦截器http拦截器一般通过定义factory的方式实现: myApp.factory('MyInterceptor',function($q) {
return {
// 可选,拦截成功的请求
request: function(config) {
// 进行预处理
// ...
return config || $q.when(config);
},// 可选,拦截失败的请求
requestError: function(rejection) {
// 对失败的请求进行处理
// ...
if (canRecover(rejection)) {
return responSEOrNewPromise
}
return $q.reject(rejection);
},// 可选,拦截成功的响应
response: function(response) {
// 进行预处理
// ....
return response || $q.when(reponse);
},// 可选,拦截失败的响应
responseError: function(rejection) {
// 对失败的响应进行处理
// ...
if (canRecover(rejection)) {
return responSEOrNewPromise
}
return $q.reject(rejection);
}
};
});
随后,我们需要将实现的拦截器加入到 myApp.config(function($httpProvider) {
$httpProvider.interceptors.push(MyInterceptor);
});
当然,我们也可以通过匿名factroy的方式实现: $httpProvider.interceptors.push(function($q) {
return {
request: function(config) {
// bala
},response: function(response) {
// bala
},// bala
};
});
可以看到,每个拦截器都可以实现4个可选的处理函数,分别对应请求(成功/失败)和响应(成功/失败)的拦截:
request: function(config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers['X-Access-Token'] = $window.sessionStorage.token;
}
return config || $q.when(config);
}
使用用例为演示Angular $http拦截器的使用方法,下面通过几个常用的用例来说明: 利用request拦截器模拟实现Angular的XSRF(即CSRF)防御CSRF,即“跨站请求伪造”,不过不知道为什么Angular将其称为XSRF。当处理与后台交互时,Angular的$http会尝试从客户端cookie中读取一个token,其默认的key为 /** * 正式开发中Angular会主动进行XSRF防御(只要cookie中存在key为`XSRF-TOKEN`的token), * 一般不需要手动进行,除非cookie中不存在key为`XSRF-TOKEN`的token,这里只是模拟实现 */
request: function(config) {
if(config.url.indexOf('SAME_DOMAIN_API_URL') > -1) {
config.headers['X-XSRF-TOKEN'] = $cookies.get('XSRF-TOKEN');
}
return config;
}
如果初始http请求头部类似于: "headers": { "Accept": "application/json,text/plain,*/*" } 那么经过上述的拦截器后,其http请求头部就变成了: "headers": { "Accept": "application/json,*/*","X-XSRF-TOKEN": X-XSRF-TOKEN-VALUE } 利用response拦截器模拟实现Angular JSON易损性(JSON vulnerability)防御Angular在$http请求安全性方面不仅为我们设计了XSRF(CSRF)防御,而且针对请求JSON数据的Url可能通过类似于 response: function(response) {
var data = examineJSONResponse(response); // 假设存在这样一个方法
if(!data) {
response = validateJSONResponse(response); // 假设存在这样一个方法
}
return response || $q.when(reponse);
}
利用request拦截器和response拦截器计算http请求耗时这个需求可能在开发中并不常用,这里只是作为同时使用request拦截器和response拦截器的例子,我们可以在request拦截器和response拦截器中分别计时,然后求得其差值即可: myApp.factory('timestampMarker',[function() {
return {
request: function(config) {
config.requestTimestamp = new Date().getTime();
return config;
},response: function(response) {
response.config.responseTimestamp = new Date().getTime();
return response;
}
};
}]);
myApp.config(['$httpProvider',function($httpProvider) {
$httpProvider.interceptors.push('timestampMarker');
}]);
这样我们在每次请求后台时,就能够计算出相应请求的耗时了,如: $http.get('https://api.github.com/users/liuwenzhuang/repos').then(function(response) {
var time = response.config.responseTimestamp - response.config.requestTimestamp;
console.log('The request took ' + (time / 1000) + ' seconds.');
});
总结$http作为Angular中的核心service,其功能非常强大便捷,今天描述了其子功能http拦截器的概念和描述方式,有理解不正确的地方,请大家留言告知。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |