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 相关文章推荐
jQuery.Validate 使用笔记(jQuery Validation范例 )
Jun 25 Javascript
javascript与webservice的通信实现代码
Dec 25 Javascript
js控制页面控件隐藏显示的两种方法介绍
Oct 09 Javascript
javascript中with()方法的语法格式及使用
Aug 04 Javascript
jQuery判断对象是否存在的方法
Feb 05 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
Dec 07 Javascript
Angular排序实例详解
Jun 28 Javascript
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
微信小程序实现页面浮动导航
Jan 28 Javascript
手写Vue弹窗Modal的实现代码
Sep 11 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
再论Javascript下字符串连接的性能
2011/03/05 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
JSON相关知识汇总
2015/07/03 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
python zip文件 压缩
2008/12/24 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
Python将字典转换为XML的方法
2020/08/01 Python
python 5个实用的技巧
2020/09/27 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
服装设计师职业生涯规划范文
2014/02/28 职场文书
教师产假请假条范文
2014/04/10 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
节能标语大全
2014/06/21 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
MySQL 逻辑备份 into outfile
2022/05/15 MySQL