axios拦截器

 

页面发送http请求,很多情况我们要对请求和其响应进行特定的处理;如果请求数非常多,单独对每一个请求进行处理会变得非常麻烦,程序的优雅性也会大打折扣。好在强大的axios为开发者提供了这样一个API:拦截器。拦截器分为 请求(request)拦截器和 响应(response)拦截器。

axios拦截器简单介绍

请求拦截器

1 axios.interceptors.request.use(function (config) {
2 // 在发起请求请做一些业务处理
3 return config;
4 }, function (error) {
5 // 对请求失败做处理
6 return Promise.reject(error);
7 });

响应拦截器

1 axios.interceptors.response.use(function (response) {
2 // 对响应数据做处理
3 return response;
4 }, function (error) {
5 // 对响应错误做处理
6 return Promise.reject(error);
7 });

vue添加axios拦截器

安装 axios

npm install axios –save-dev

新建文件 axios.js

开始统一封装axios, 首先引入axios、qs依赖

1 import axios from "axios"; 2 import qs from "qs";

然后创建一个axios实例,这个process.env.BASE_URL在config/dev.evn.js、prod.evn.js里面进行配置:

1 /****** 创建axios实例 ******/
2 const service = axios.create({
3 baseURL: process.env.BASE_URL, // api的base_url
4 timeout: 5000 // 请求超时时间
5 });

使用request拦截器对axios请求配置做统一处理

 1 service.interceptors.request.use(config => {
2 app.$vux.loading.show({
3 text: '数据加载中……'
4 });
5 config.method === 'post'
6 ? config.data = qs.stringify({...config.data})
7 : config.params = {...config.params};
8 config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
9 return config;
10 }, error => { //请求错误处理
11 app.$vux.toast.show({
12 type: 'warn',
13 text: error
14 });
15 Promise.reject(error)
16 }
17 );

对response做统一处理

 1 service.interceptors.response.use(
2 response => { //成功请求到数据
3 app.$vux.loading.hide();
4 //这里根据后端提供的数据进行对应的处理
5 if (response.data.result === 'TRUE') {
6 return response.data;
7 } else {
8 app.$vux.toast.show({
9 //常规错误处理
10 type: 'warn',
11 text: response.data.data.msg
12 });
13 }
14 },
15 error => { //响应错误处理console.log('error');
16 console.log(error);
17 console.log(JSON.stringify(error));
18 let text = JSON.parse(JSON.stringify(error)).response.status === 404
19 ? '404'
20 : '网络异常,请重试';
21 app.$vux.toast.show({
22 type: 'warn',
23 text: text
24 });
25 return Promise.reject(error)
26 }
27 )

将axios实例暴露出去

1 export default service;

这样一个简单的拦截器就完成了

在main.js中进行引用,并配置一个别名($ajax)来进行调用

1 import axios from 'axios'
2 import '../axios.js' //axios.js的路径
3
4 Vue.prototype.$ajax = axios

应用:一个简单的登录接口

 1 this.$ajax({
2   method: 'post',
3   url: '/login',
4   data: {
5     'userName': 'haha',
6     'password': '123456'
7   }
8 }).then(res => {
9   console.log(res)
10 })

使用场景

eg: axios拦截器对路由进行拦截

1.路由拦截

在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录。如果用户已经登录,则顺利进入路由,否则就进入登录页面。

 1 const routes = [
2 {
3 path: '/',
4 name: '/',
5 component: Index
6 },
7 {
8 path: '/repository',
9 name: 'repository',
10 meta: {
11 requireAuth: true, // 添加该字段,表示进入这个路由是需要登录的
12 },
13 component: Repository
14 },
15 {
16 path: '/login',
17 name: 'login',
18 component: Login
19 }
20 ];

定义完路由后,我们主要是利用vue-router提供的钩子函数beforeEach()对路由进行判断。

 1 router.beforeEach((to, from, next) => {
2 if (to.meta.requireAuth) { // 判断该路由是否需要登录权限
3 if (token) { // 判断当前的token是否存在
4 next();
5 }
6 else {
7 next({
8 path: '/login',
9 query: {redirect: to.fullPath} // 将跳转的路由path作为参数,登录成功后跳转到该路由
10 })
11 }
12 }
13 else {
14 next();
15 }
16 })

to.meta中是我们自定义的数据,其中就包括我们刚刚定义的requireAuth字段
通过这个字段来判断该路由是否需要登录权限
需要的话,同时当前应用不存在token,则跳转到登录页面,进行登录。登录成功后跳转到目标路由。

这种方式只是简单的前端路由控制,并不能阻止用户访问,假设有一种情况:当前token失效了,但是token依然保存在本地。这时候你去访问需要登录权限的路由时,实际上应该让用户重新登录。这时候就需要结合 http 拦截器 + 后端接口返回的http 状态码来判断。

2.拦截器

要想统一处理所有http请求和响应,就得用上 axios 的拦截器。通过配置http response inteceptor,当后端接口返回401 Unauthorized(未授权),让用户重新登录。

 1 // http request 拦截器
2 axios.interceptors.request.use(
3 config => {
4 if (stoken) { // 判断是否存在token,如果存在的话,则每个http header都加上token
5 config.headers.Authorization = `token ${store.state.token}`;
6 }
7 return config;
8 },
9 err => {
10 return Promise.reject(err);
11 });
12
13 // http response 拦截器
14 axios.interceptors.response.use(
15 response => {
16 return response;
17 },
18 error => {
19 if (error.response) {
20 switch (error.response.status) {
21 case 401:
22 // 返回 401 清除token信息并跳转到登录页面
23
24 router.replace({
25 path: 'login',
26 query: {redirect: router.currentRoute.fullPath}
27 })
28 }
29 }
30 return Promise.reject(error.response.data) // 返回接口返回的错误信息
31 });

axios封装的拦截器的应用的更多相关文章

  1. 细说vue axios登录请求拦截器

    当我们在做接口请求时,比如判断登录超时时候,通常是接口返回一个特定的错误码,那如果我们每个接口都去判断一个耗时耗力,这个时候我们可以用拦截器去进行统一的http请求拦截. 1.安装配置axios cn ...

  2. vue+axois 封装请求+拦截器(请求锁+统一错误)

     需求 封装常用请求 拦截器-请求锁 统一处理错误码 一.封装常用的请求 解决痛点:不要每一个模块的api都还要写get,post,patch请求方法.直接将这些常用的方法封装好. 解决方案:写一个类 ...

  3. axios请求响应拦截器的应用

    什么是axios拦截器? 一般在使用axios时,会用到拦截器的功能,一般分为两种:请求拦截器.响应拦截器. 请求拦截器在请求发送前进行必要操作处理 例如添加统一cookie.请求体加验证.设置请求头 ...

  4. Axios Token验证拦截器

    import axios from 'axios'; // req拦截 axios.interceptors.request.use( //设置头部的token config.headers['tok ...

  5. jquery.ajax与axios及定义拦截器

    首先导入jquery和axios包 jquery.ajax function reg(){ var username = $("#username").val(); var pas ...

  6. vue axios请求/响应拦截器

    // main.js中配置 // 引入 axios import Axios from 'axios' // 这时候如果在其它的组件中,是无法使用 axios 命令的. // 但如果将 axios 改 ...

  7. structs2----数据封装以及拦截器

    技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet ...

  8. Vue2学习小记-给Vue2路由导航钩子和axios拦截器做个封装

    1.写在前面 最近在学习Vue2,遇到有些页面请求数据需要用户登录权限.服务器响应不符预期的问题,但是总不能每个页面都做单独处理吧,于是想到axios提供了拦截器这个好东西,再于是就出现了本文. 2. ...

  9. vue axios拦截器介绍

    关于axios的拦截器是一个作用非常大,非常好用的东西.分为请求拦截器和响应拦截器两种.我一般把拦截器写在main.js里. 1. 请求拦截器 请求拦截器的作用是在请求发送前进行一些操作,例如在每个请 ...

随机推荐

  1. oracle用索引提高效率

    索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最 ...

  2. phpstorm IDEA 双击Shift键会弹出 SearchEverywhere 对话框,如何取消这个功能

    https://blog.csdn.net/qq_27598243/article/details/80526352 解决方法:一:Open lib/resources.jar/idea/Platfo ...

  3. html--图片img

    一.图片的基本格式 当前万维网上流行的图像格式以GIF及JPEG为主,另外还有一个PNG.以下做分别介绍: 1.GIF格式:采用LZW压缩,是以压缩相同颜色的色块来减少图像大小的.(LZW压缩是一种能 ...

  4. HBuider快捷键

    朋友推荐用Hbuilder编辑器,看了下Hbuilder官网和那视频,感觉牛逼哄哄的, 自己也就体验了一下,打开Hbuilder的快捷键列表,每个快捷键都体验了一下,以下展示出来的,每一个都是精华,每 ...

  5. Python--day62--什么时候用GET请求和POST请求

    1,GET请求和POST请求 都数据HTTP协议规定的请求方法 2,什么时候用GET请求? 1,浏览器想要得到一个HTML页面的时候 2,搜索引擎查询关键字的时候 3,什么时候用POST? 1,像后端 ...

  6. Python--day40--全局解释器锁

    1,起一百个线程和起一百个进程所花的时间对比(开启效率的较量): import time from threading import Thread from multiprocessing impor ...

  7. [转]C#操作Memcached帮助类

    在VS中安装Memcached,直接在NuGet下搜索Memcached,选择第一个进行安装: 服务端资源下载地址:https://pan.baidu.com/s/1gf3tupl 接下来开始写程序, ...

  8. win10 uwp win2d CanvasVirtualControl 与 CanvasAnimatedControl

    本文来告诉大家 CanvasVirtualControl ,在什么时候使用这个控件. 在之前的入门教程win10 uwp win2d 入门 看这一篇就够了我直接用的是CanvasControl,实际上 ...

  9. linux scull 函数open 方法

    open 方法提供给驱动来做任何的初始化来准备后续的操作. 在大部分驱动中, open 应当 进行下面的工作: 检查设备特定的错误(例如设备没准备好, 或者类似的硬件错误 如果它第一次打开, 初始化设 ...

  10. P1020 从大到小排序

    题目描述 给你n个整数,请你按照从大到小的顺序输出它们. 输入格式 输入的第一行包含一个整数 \(n(1 \le n \le 10^3)\) ,用于表示元素的个数. 输入的第二行包含 \(n\) 个整 ...