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. springmvc单Redis实例实现分布式锁(解决锁超时问题)

    一.前言 关于redis分布式锁, 查了很多资料, 发现很多只是实现了最基础的功能, 但是, 并没有解决当锁已超时而业务逻辑还未执行完的问题, 这样会导致: A线程超时时间设为10s(为了解决死锁问题 ...

  2. [Ramda] Handle Errors in Ramda Pipelines with tryCatch

    Handling your logic with composable functions makes your code declarative, leading to code that's ea ...

  3. linux scull 中的缺陷

    让我们快速看一段 scull 内存管理代码. 在写逻辑的深处, scull 必须决定它请求的内 存是否已经分配. 处理这个任务的代码是: if (!dptr->data[s_pos]) { dp ...

  4. H3C使用ping命令--用户视图

    完整的ping命令,用于下面参考 <H3C>ping 1.1.1.1   PING 1.1.1.1: 56  data bytes, press CTRL_C to break     R ...

  5. tet-2

      一.html和css部分 1.如何理解CSS的盒子模型? 标准盒子模型:宽度=内容的宽度(content)+ border + padding 低版本IE盒子模型:宽度=内容宽度(content+ ...

  6. springboot-aop日志打印

    package com.cinc.ecmp.client; import com.cinc.ecmp.enums.BackResultEnum; import com.cinc.ecmp.except ...

  7. Linux 内核驱动结构嵌入

    如同大部分驱动核心结构的情形, device_driver 结构常常被发现嵌到一个更高级的, 总 线特定的结构. lddbus 子系统不会和这样的趋势相反, 因此它已定义了它自己的 ldd_drive ...

  8. 2019-5-12-WPF-模拟触摸设备

    title author date CreateTime categories WPF 模拟触摸设备 lindexi 2019-05-12 16:19:32 +0800 2019-5-11 17:2: ...

  9. java 如何重写equals

    java中重写equals表面上看只涉及equals与hashCode两个方法,但如果仔细考虑发现重写一个逻辑完整的equals并不容易,需要考虑克隆,继承(多态)等问题,下面是最近的几点心得 1.先 ...

  10. Android 隐藏顶部菜单栏

    Android 隐藏状态栏 在Activity中: getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 在fragmen ...