≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 网络编程 > vue.js

使用proxytable 配置解决 vue-cli 的跨域请求问题【推荐】

人气:370 时间:2019-04-11

这篇文章主要为大家详细介绍了使用proxytable 配置解决 vue-cli 的跨域请求问题【推荐】,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的小编两巴掌来看看吧!

 

本文适用人群:

 

  • 会使用 vue-cli 搭建一个基本的 vue webpack 项目,本文的目录结构基于 webpack 模板结构
  • 懂得 axios 基本用法

 

问题导向

 

日常开发中,前端经常需要通过 ajax 从后端获取数据。而在这种前后端分离的开发模式下,往往前端项目与后端项目的 IP地址、端口号、协议 大概率是不一样的,由于浏览器的安全策略设定,不进行相应配置的话,前端的请求就会被浏览器拦截掉啦。

假设某个页面组件在加载的时候会向后端发送一个请求,然后根据返回的结果来渲染页面。代码示例如下:

前端项目通过 npm run dev 运行在 localhost:8081 上,

后端项目通过 apache 运行在 localhost/test/public/api/books 上

代码如下:


<template>
 <div class="hello">
 <ul>
  <li v-for="book of books">{{book.name}}</li>
 </ul>
 </div>
</template>
<script>
 import axios from 'axios';
 export default {
 name: 'HelloWorld',
 data() {
  return {
  books: []
  }
 },
 created(){
  let self = this;
  axios.get("http://localhost/test/public/api/books")
  .then((response)=>{
  self.books = response.data;
  });
 }
 }
</script>

直接访问后端链接,将能得到以下返回内容:

代码如下:


[
 {"name":"javascript \u4ece\u5165\u95e8\u5230\u653e\u5f03"},
 {"name":"\u9888\u690e\u75c5\u5eb7\u590d\u6307\u5357"},
 {"name":"\u89c6\u529b\u4fdd\u62a4\u6307\u5357"}
]

但是当我们在浏览器中运行前端页面,会报错!控制台打印如下:

【图片暂缺】 

可见,浏览器对于跨域访问进行了限制,因为在例子中前端项目url与后端项目url的端口号不相同,所以浏览器拦截了我们的请求。

 

解决方案

 

解决方式有很多种,包括可以很简单粗暴地让后端代码设置一个 Access-Control-Allow-Origin 头来解决这个问题。但是,在实际开发中,后端的小哥哥们才不会理会你这个羞耻的小请求呢~

 

那怎么办咧~

 

其实我们可以通过配置 vue 项目中的 config/index.js 来解决问题。

将 dev 中的 proxyTable 改为如下:

代码如下:


proxyTable: {
 '/api': {
 target: 'http://localhost/test/public/api/',
 changeOrigin: true,
 pathRewrite: {
  '^/api': ''
 }
 }
},

接着,再将 vue 组件页面中的 ajax 请求代码改为如下:

代码如下:


// 改为这样,原来是这样:axios.get("http://localhost/test/public/api/books")
axios.get("/api/books")

重新运行 npm run dev ,运行效果如下:

【图片暂缺】 

当当当!成功!

为什么这么做?

当我们打开浏览器的开发者工具查看一下网络请求就会发现,这个 ajax 请求竟然是向我们前端的 webpack-dev-server 发送的:

【图片暂缺】 

而且居然能返回正确的数据???

浏览器有安全策略限制,但是第三方的服务(服务器)没有呀,所以我们可以通过让浏览器访问前端开发服务器的url,让前端开发服务器去向后端服务器发送请求,再返回数据给浏览器,这样子就不存在跨域问题啦。

【图片暂缺】 

当我们在配置中这么写时:

代码如下:


proxyTable: {
 '/api': {
 target: 'http://localhost/test/public/api/',
 }
},

对于8081端口的开发服务器而言,所有以 /api 开头的 uri 都会被转发到 http://localhost/test/public/api/ ,

也就是说,在浏览器中访问 localhost:8081/api/books ,前端开发服务器就会向 http://localhost/test/public/api/api/books 请求数据。就是简单粗暴地在 target 之后拼接上当前的uri。

会发现这样子做,实际的 url 中多了一个 /api ,不满足我们的需求,所以可以通过 pathRewrite 将这几个字符串替换掉。

代码如下:


// 将 "/api" 开头的 url 中的 "api" 替换成 空
proxyTable: {
 '/api': {
 target: 'http://localhost/test/public/api/',
 pathRewrite: {
  '^/api': ''
 }
 }
},
// 根据上面的规则
// 当在浏览器访问 localhost:8081/api/books
// 则实际访问的是 http://localhost/test/public/api/books
// 假设设置成 
pathRewrite: {'^/api': '/somethingnew'}
// 当在浏览器访问 localhost:8081/api/books
// 则实际访问的是 http://localhost/test/public/somethingnew/books

而配置项 changeOrigin: true 则是设置了前端开发服务器向后端发送请求时 HTTP 包中的 HOST 字段。当设置为 true 时,HOST 会被设置成目标地址(target)中的主机。当后端服务器是虚拟主机时,这个选项显得尤为重要,或者说,同一个IP绑定了多个服务器服务时显得尤为重要。不设置的话,可能会导致请求不到数据。

【图片暂缺】

更多的 proxyTable 可用参数可以参考 http-proxy-middleware 的文档

 

 

本文来自:http://www.q1010.com/184/5495-0.html

注:关于使用proxytable 配置解决 vue-cli 的跨域请求问题【推荐】的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:vue.js

您可能感兴趣的文章

  • vue组件jsx语法的具体使用
  • Vue单页及多页应用全局配置404页面实践记录
  • VUE2.0中Jsonp的使用方法
  • vue路由拦截及页面跳转的设置方法
  • 基于Vue的延迟加载插件vue-view-lazy
  • vue.js过滤器+ajax实现事件监听及后台php数据交互实例
  • 让Vue也可以使用Redux的方法
  • vue组件name的作用小结
  • vue2单元测试环境搭建
  • 分析Vue单元测试case写法
上一篇:Vue仿支付宝支付功能
下一篇:vue路由拦截及页面跳转的设置方法
热门文章
  • Vue 报错TypeError: this.$set is not a function 的解决方法
  • vue实现动态添加数据滚动条自动滚动到底部的示例代码
  • vue项目设置scrollTop不起作用(总结)
  • vue项目中使用vue-i18n报错的解决方法
  • iview实现select tree树形下拉框的示例代码
  • 分析关于element级联选择器数据回显问题
  • vue项目打包后打开页面空白解决办法
  • 解决element ui select下拉框不回显数据问题的解决
  • element-ui table span-method(行合并)的实现代码
  • element-ui 设置菜单栏展开的方法
  • 最新文章
    • 理解vue ssr原理并自己搭建简单的ssr框架
    • vue favicon设置以及动态修改favicon的方法
    • vue-router启用history模式下的开发及非根目录部署方法
    • 从零开始在NPM上发布一个Vue组件的方法步骤
    • Element input树型下拉框的实现代码
    • Vue 报错TypeError: this.$set is not a function 的解决方法
    • Vue.js组件高级特性实例分析
    • 浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
    • 分析Vue.js自定义tipOnce指令用法实例
    • 浅谈vuex actions和mutation的异曲同工

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。