vue中axios解决跨域问题和拦截器的使用方法


Posted in Javascript onMarch 07, 2018

vue中axios不支持vue.use()方式声明使用。 所以有两种方法可以解决这点:

第一种: 在main.js中引入axios,然后将其设置为vue原型链上的属性,这样在组件中就可以直接 this.axios使用了

import axios from 'axios';
Vue.prototype.axios=axios;

components:

this.axios({
    url:"a.xxx",
    method:'post',
    data:{
      id:3,
      name:'jack'
    }
  })
  .then(function(res){
    console.log(res);
  })
  .catch(function(err){
    console.log(err);
  })
 }

这里需要注意一点,就是在axios中把请求到的数据 使用this复制给data是无效的,使用箭头函数可以解决。

vue cli脚手架前端调后端数据接口时候的本地代理跨域问题,如我在本地localhost访问接口http://10.1.5.11:8080/xxx/duty?time=2017-07-07 14:57:22',是要跨域的才可以访问的,如果直接访问会报 XMLHTTPRequest can not load http://10.1.5.11:8080/xxx/duty?time=2017-07-07 14:57:22'. Response to preflight request doesn't pass access control….

为什么存在跨域问题?因为这是非同源互相通讯,具体可以自己去google了解,这里只需要在webpack配置一下proxyTable就OK了,在config中找到index.js如下 :

config/index.js

dev: {
  proxyTable: {
   '/api': {
    target: 'http://10.1.5.11:8080/',//设置你调用的接口域名和端口号 
    changeOrigin: true,   //跨域
    pathRewrite: {
     '^/api': '/'     //这里理解成用‘/api'代替target里面的地址,后面组件中我们掉接口时直接用api代替 比如我要调用'http://10.1.5.11:8080/xxx/duty?time=2017-07-07 14:57:22',直接写‘/api/xxx/duty?time=2017-07-07 14:57:22'即可
    }
   }

跨域成功,但是这只是开发环境(dev)中解决了跨域问题,生产环境中真正部署到服务器上如果是非同源还是存在跨域问题,如我们部署的服务器端口是3001,需要前后端联调,第一步前端我们可以分生产production和开发development两种环境分别测试,在config/dev.env.js和prod.env.js里也就是开发/生产环境下分别配置一下请求的地址API_HOST,开发环境中我们用上面配置的代理地址api,生产环境下用正常的接口地址,所以这样配置,分别在config/dev.env.js和prod.env.js两个文件中进行以下配置。

config/dev.env.js:

module.exports = merge(prodEnv, {
 NODE_ENV: '"development"',//开发环境
 API_HOST:"/api/"
})

prod.env.js

module.exports = {
 NODE_ENV: '"production"',//生产环境
 API_HOST:'"http://10.1.5.11:8080/"'
}

当然不管是开发还是生产环境都可以直接请求http://10.1.5.11:8080//。配置好之后测试时程序会自动判断当前是开发还是生产环境,然后自动匹配API_HOST,我们在任何组件里都能用process.env.API_HOST来使用地址如:

instance.post(process.env.API_HOST+'user/login', this.form)

然后第二步后端服务器配置一下cros跨域即可,就是access-control-allow-origin:*允许所有访问的意思。综上:开发的环境下我们前端可以自己配置个proxy代理就能跨域了,真正的生产环境下还需要后端的配合的。某大神说:此方法ie9及以下不好使,如果需要兼容,最好的办法是后端在服务器端口加个代理,效果类似开发时webpack的代理。

axios发送get post请求问题

发送post请求时一般都要设置Content-Type,发送内容的类型,application/json指发送json对象但是要提前stringify一下。application/xxxx-form指发送?a=b&c=d格式,可以用qs的方法格式化一下,qs在安装axios后会自动安装,只需要组件里import一下即可。

const postData=JSON.stringify(this.formCustomer);
'Content-Type':'application/json'}
const postData=Qs.stringify(this.formCustomer);//过滤成?&=格式
'Content-Type':'application/xxxx-form'}

拦截器的使用

当我们访问某个地址页面时,有时会要求我们重新登录后再访问该页面,也就是身份认证失效了,如token丢失了,或者是token依然存在本地,但是却失效了,所以单单判断本地有没有token值不能解决问题。此时请求时服务器返回的是401错误,授权出错,也就是没有权利访问该页面。

我们可以在发送所有请求之前和操作服务器响应数据之前对这种情况过滤。

// http request 请求拦截器,有token值则配置上token值
axios.interceptors.request.use(
  config => {
    if (token) { // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
      config.headers.Authorization = token;
    }
    return config;
  },
  err => {
    return Promise.reject(err);
  });
// http response 服务器响应拦截器,这里拦截401错误,并重新跳入登页重新获取token
axios.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 这里写清除token的代码
          router.replace({
            path: 'login',
            query: {redirect: router.currentRoute.fullPath}  //登录成功后跳入浏览的当前页面
          })
      }
    }
    return Promise.reject(error.response.data) 
  });

以上这篇vue中axios解决跨域问题和拦截器的使用方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript json2 使用方法
Mar 16 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
Nov 04 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
Dec 20 Javascript
jQuery中 prop() attr()使用详解
May 19 Javascript
JavaScript如何动态创建table表格
Aug 02 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
Aug 31 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
一个炫酷的Bootstrap导航菜单
Dec 28 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
ES6中的rest参数与扩展运算符详解
Jul 18 Javascript
layui--js控制switch的切换方法
Sep 03 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
Jul 17 Javascript
node下使用UglifyJS压缩合并JS文件的方法
Mar 07 #Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
Mar 07 #Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
Mar 07 #Javascript
浅谈webpack打包之后的文件过大的解决方法
Mar 07 #Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 #Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 #Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 #Javascript
You might like
ie6 动态缩略图不显示的原因
2009/06/21 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
关于redux-saga中take使用方法详解
2018/02/27 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
Python中除法使用的注意事项
2014/08/21 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
好人好事事迹材料
2014/02/12 职场文书
产品设计开发计划书
2014/05/07 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
基石观后感
2015/06/12 职场文书
五一放假通知怎么写
2015/08/18 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
关于Python中*args和**kwargs的深入理解
2021/08/07 Python
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js