欢迎您访问我爱IT技术网,今天小编为你分享的javascript教程:【浅析AngularJs HTTP响应拦截器】,下面是详细的讲解!
浅析AngularJs HTTP响应拦截器
为何要用拦截器?
任何时候,如果我们想要为请求添加全局功能,例如身份认证、错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段。
angularJs通过拦截器提供了一个从全局层面进行处理的途径.
拦截器允许你:
通过实现 request 方法拦截请求: 该方法会在 $http 发送请求道后台之前执行,因此你可以修改配置或做其他的操作。该方法接收请求配置对象(request configuration object)作为参数,然后必须返回配置对象或者 promise 。如果返回无效的配置对象或者 promise 则会被拒绝,导致 $http 调用失败。
通过实现 response 方法拦截响应: 该方法会在 $http 接收到从后台过来的响应之后执行,因此你可以修改响应或做其他操作。该方法接收响应对象(response object)作为参数,然后必须返回响应对象或者 promise。响应对象包括了请求配置(request configuration),头(headers),状态(status)和从后台过来的数据(data)。如果返回无效的响应对象或者 promise 会被拒绝,导致$http 调用失败。
通过实现 requestError 方法拦截请求异常: 有时候一个请求发送失败或者被拦截器拒绝了。请求异常拦截器会俘获那些被上一个请求拦截器中断的请求。它可以用来恢复请求或者有时可以用来撤销请求之前所做的配置,比如说关闭进度条,激活按钮和输入框什么之类的。
通过实现 responseError 方法拦截响应异常: 有时候我们后台调用失败了。也有可能它被一个请求拦截器拒绝了,或者被上一个响应拦截器中断了。在这种情况下,响应异常拦截器可以帮助我们恢复后台调用。
拦截器的核心是服务工厂,通过向$httpprovider.interceptors数组中添加服务工厂。在$httpProvider中进行注册。
angularJs提供四种拦截器,其中两种成功拦截器(request、response),两种失败拦截器(requestError、responseError)。
在服务中添加一种或多种拦截器:
angular.module("myApp", [])
.factory('httpInterceptor', [ '$q', '$injector',function($q, $injector) {
var httpInterceptor={
'responseError' : function(response) {
......
return $q.reject(response);
},
'response' : function(response) {
......
return response;
},
'request' : function(config) {
......
return config;
},
'requestError' : function(config){
......
return $q.reject(config);
}
}
return httpInterceptor;
}
然后使用$httpProvider在.config()函数中注册拦截器
angular.module("myApp", [])
.config([ '$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('httpInterceptor');
} ]);
实际的例子:(对401、404的拦截)
routerApp.config([ '$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('httpInterceptor');
} ]);
routerApp.factory('httpInterceptor', [ '$q', '$injector',function($q, $injector) {
var httpInterceptor={
'responseError' : function(response) {
if (response.status==401) {
var rootScope=$injector.get('$rootScope');
var state=$injector.get('$rootScope').$state.current.name;
rootScope.stateBeforLogin=state;
rootScope.$state.go("login");
return $q.reject(response);
} else if (response.status===404) {
alert("404!");
return $q.reject(response);
}
},
'response' : function(response) {
return response;
}
}
return httpInterceptor;
}
]);
Session 注入(请求拦截器)
这里有两种方式来实现服务端的认证。第一种是传统的 Cookie-Based 验证。通过服务端的 cookies 来对每个请求的用户进行认证。另一种方式是 Token-Based 验证。当用户登录时,他会从后台拿到一个 sessionToken。sessionToken 在服务端标识了每个用户,并且会包含在发送到服务端的每个请求中。
下面的 sessionInjector 为每个被俘获的请求添加了 x-session-token 头 (如果当前用户已登录):
<!-- lang: js -->
module.factory('sessionInjector', ['SessionService', function(SessionService) {
var sessionInjector={
request: function(config) {
if (!SessionService.isAnonymus) {
config.headers['x-session-token']=SessionService.token;
}
return config;
}
};
return sessionInjector;
}]);
module.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('sessionInjector');
}]);
然后创建一个请求:
<!-- lang: js -->
$http.get('https://api.github.com/users/naorye/repos');
被 sessionInjector 拦截之前的配置对象是这样的:
<!-- lang: js -->
{
"transformRequest": [
null
],
"transformResponse": [
null
],
"method": "GET",
"url": "https://api.github.com/users/naorye/repos",
"headers": {
"Accept": "application/json, text/plain, **",
"x-session-token": 415954427904
}
}
以上内容给大家介绍了AngularJs HTTP响应拦截器的相关知识,希望本文分享能够给大家带来帮助。
关于浅析AngularJs HTTP响应拦截器的用户互动如下:
相关问题:AngularJS 错误怎么统一处理
答:您好,希望以下回答能帮助您 原理就是插入一个拦截器到 responseInterceptors,代码放到 module 定义下: angular.module('app', ['ngSanitize'], ['$httpProvider', '$routeProvider', '$locationProvider', ($httpProvider, $routeProvider, $... >>详细
相关问题:jquery from调教后拦截器重定向
答:我原来的设计是spring MVC上面做的。拦截器拦截返回的在一个公用js里面有调用方法,添加全局ajax的请求方法。 就是设置所有的ajax返回后先执行一个判断看是否超时,如果超时则跳转到指定页面。 js代码片段 $.ajaxSetup({//如果session超时则跳转... >>详细
相关问题:Spring中拦截/和拦截/*的区别
答:一、我们都知道在基于Spring的Application中,需要在web.xml中增加下面类似的配置信息: org.springframework.web.context.ContextLoaderListener servletName org.springframework.web.servlet.DispatcherServlet 1 servletName / 此处需要特别... >>详细
- 【firefox】firefox浏览器不支持innerText的解决
- 【Extjs】Extjs学习过程中新手容易碰到的低级错误
- 【clearInterval】js clearInterval()方法的定义
- 【dom】javascript dom追加内容实现示例-追加内容
- 【checkbox】让checkbox不选中即将选中的checkbox
- 【Array】js中更短的 Array 类型转换-类型转换
- 【append】append和appendTo的区别以及appendChil
- 【ExtJs】ExtJs 表单提交登陆实现代码-表单提交-
- 【ajax清除浏览器缓存】Ajax清除浏览器js、css、
- 【AJAX】AJAX异步从优酷专辑中采集所有视频及信息
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
