vue-cli 3.0之跨域请求devServer代理配置_vue3 devserver proxy-程序员宅基地

技术标签: vue-cli3 devServer代理配置  vue-cli3.0 跨域设置  前端  devServer代理配置  跨域 同源策略  

概念

什么是同源策略

同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
所谓同源是指:协议、域名、端口都相同

什么是跨域
跨域就是不同源,就是不满足协议、域名、端口都相同的约定
如:看下面的链接是否与 http://www.test.com/index.html 同源?

http://www.test.com/dir/login.html 同源
https://www.test.com/index.html 不同源 协议不同(https)
http://www.test.com:90/index.html 不同源 端口不同(90)
http://www.demo.com/index.html 不同源 域名不同(demo)

当协议、域名、端口中任意一个不相同时,就是不同源。若不同源之间相互请求资源,就算作跨域

跨域请求devServer代理几种配置

1:先在项目的根目录下新建 vue.config.js 文件
2:在module.exports内设置devServer来处理代理

假设我们要把http://localhost:8081/allin/policy/getProductInfo 中的域名换成 www.test.com 相当于把请求换成 http://www.test.com/allin/policy/getProductInfo

第一种代理方式

不设置 axios 的 baseURL 或者 赋值为空字符串

axios.defaults.baseURL = '';

请求的url地址为 /allin/policy/getProductInfo

  axios({
      ...
      url:'/allin/policy/getProductInfo',
      ...
  })

注意
请求的地址必须是包含 /allin ,但一定要注意 axios的baseURL 的配置,baseURL的配置会添加到每一个请求的 url 前面(下面的几种方式也是同样的)

 devServer: {
    proxy: {
        '/allin': {
            //要访问的跨域的域名
            target: 'http://www.test.com',
            ws: true, // 是否启用websockets
            secure:false, // 使用的是http协议则设置为false,https协议则设置为true
    	    //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样客户端端和服务端进行数据的交互就不会有跨域问题
            changOrigin: true,
        }
    }
}

相当于遇见 /allin 才做代理,则会把默认域名http://localhost:8081地址改成 target 对应的http://www.test.com地址,但是在浏览器的F12下,Network->Headers中看到还是http://localhost:8081/allin/policy/getProductInfo, 但是真正的请求的地址则是http://www.test.com/allin/policy/getProductInfo

注意
如果只是修改域名,则不需要写pathRewrite,但如果要写,则必须写成pathRewrite: {’^/allin’: ‘/allin’},相当于把/allin标识还替换成/allin

第二种代理方式

不设置 axios 的 baseURL 或者 赋值为空字符串

axios.defaults.baseURL = '';

请求的url地址为 /allin/getProductInfo

  axios({
      ...
      url:'/allin/getProductInfo',
      ...
  })

注意
这里请求时我没有写/polic,目的是在拦截跨域时我在 pathRewrite 上加上

devServer: {
    proxy: {
        '/allin': {
            //要访问的跨域的api的域名
            target: 'http://www.test.com',
            ws: true,
            secure:false, // 使用的是http协议则设置为false,https协议则设置为true
            changOrigin: true,
            pathRewrite: {
                '^/allin': '/allin/policy'
            }
        }
    }
}

相当于请求遇见 /allin 则替换成 /allin/policy注意/policy后边没有/,这样拼接成功才会是http://www.test.com/allin/policy/getProductInfo

第三种代理方式

不设置 axios 的 baseURL 或者 赋值为空字符串

axios.defaults.baseURL = '';

请求的url地址为 /allin/getProductInfo

  axios({
      ...
      url:'/allin/getProductInfo',
      ...
  })

注意
这里请求时我也没有写/polic,目的是在拦截跨域时我在 target 上加上

devServer: {
     proxy: {
         '/allin': {
             //要访问的跨域的api的域名
             target: 'http://www.test.com/allin/policy',
             ws: true,
             secure:false, // 使用的是http协议则设置为false,https协议则设置为true
             changOrigin: true,
             pathRewrite: {
                 '^/allin': '/'  //必须这样写
             }
         }
     }
 }

这里必须要写pathRewrite: { ‘^/allin’: ‘/’},而且里边必须要写成’^/allin’: ‘/’,这里的斜杠代表的意思就是使用target中的/allin/policy,否则就要使用 第二种代理方式 配置,如果不写pathRewrite则请求不会成功。

第四种代理方式(统一代理(推荐))

设置 axios 的 baseURL 值(任意)

axios.defaults.baseURL = '/api'

这样会为所有的 请求url 前面都加上 ‘/api’,方便做 统一代理

请求的url地址为 /allin/policy/getProductInfo

  axios({
      ...
      url:'/allin/policy/getProductInfo',
      ...
  })

真正发送的请求是:/api/allin/policy/getProductInfo

 devServer: {
     proxy: {
         '/api': {
             //要访问的跨域的域名
             target: 'http://www.test.com',
             ws: true,
             secure:false, // 使用的是http协议则设置为false,https协议则设置为true
             changOrigin: true,
             pathRewrite: {
                 '^/api': ''
             }
         }
     }
 }

相当于请求遇见 /api 才做代理,但真实的请求中没有/api,所以在pathRewrite中把 /api 去掉, 这样既有了标识, 又能在请求接口中把 /api 去掉

注意
pathRewrite:如果不写则只能修改代理的域名,如果写则可以修改代理的域名和后边的路径

proxy匹配规则

在 proxy 中可以写多个代理地址

  devServer: {
      proxy: {
          '/user': {
              //要访问的跨域的api的域名
              target: 'http://www.user.com',
              ws: true,
              secure:false,
              changOrigin: true,
          },
          '/order': {
              target: 'http://www.order.com',
              ws: true,
              secure:false,
              changOrigin: true,
          },
          '/pay': {
              target: 'http://www.pay.com',
              ws: true,
              secure:false,
              changOrigin: true,
          },
      }
  }

proxy 的匹配规则是根据正则匹配 如上 /user、/order、/pay 如果 请求地址 包含 此字符串,就算匹配成功,一旦匹配成功就 不会 继续向下匹配
如:

  • 请求 /user/info 则匹配 target 为 http://www.user.com
  • 请求 /order/user/list 则匹配 target 也为 http://www.user.com
  • 请求 /order/pay/user/list 则匹配 target 也为 http://www.user.com
  • 请求 /pay/order/list 则匹配 target 为 http://www.order.com

如果我们需要以 某个路径开头 才算 匹配成功,则可以改成'^/user'、'^/account'、'^/pay'

使用场景

通过 devServer 设置的代理只适合在 本地环境 使用,即通过代理把请求发送到目标服务器上,如果发布到线上,则会提示 404 路径未找到。

解决线上环境跨域问题

  1. 前端先按 第四种代理方式 做统一代理
  2. 后端 nginx 反向代理配置

或者参考

vue-cli3.0动态配置开发,测试,线上环境

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Liu_yunzhao/article/details/90520028

智能推荐

Python篇:三维散点图scatter介绍_ax.scatter3d-程序员宅基地

文章浏览阅读6.8w次,点赞20次,收藏156次。 ##画个简单三维图import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dax = plt.figure().add_subplot(111, projection = '3d')#基于ax变量绘制三维图#xs表示x方向的变量#ys表示y方向的变量#zs表示z方向的变量..._ax.scatter3d

查看Linux的java版本报错:/lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录_java -version -bash: /usr/local/java/bin/java: /li-程序员宅基地

文章浏览阅读7.9k次,点赞3次,收藏2次。错误信息原因卸载的时候,yum的remove会把跟这个相依赖软件包都给删除了,再后来配置jdk的时候,只修改环境变量是不行的,因为它所以来的包没了##解决方案执行以下命令yum install glibc.i686再查看一下版本OK了..._java -version -bash: /usr/local/java/bin/java: /lib/ld-linux.so.2: bad elf i

Linux常见命令 21 - 网络命令 ping、ifconfig、last、lastlog、traceroute、netstat_linux网路包走向图命令-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏11次。网络常用命令 ping、ifconfig、last、lastlog、traceroute、netstat_linux网路包走向图命令

没有App,也没有 App Store,未来的手机会干掉全部应用开发人员吗?-程序员宅基地

文章浏览阅读46次。未来的 AI 手机应该是什么样儿的?在上个月的 WMC2024 上,德国电信联合高通、Brain.ai 推出了一款突破性创新的概念 AI 手机 T phone。与传统智能手机不同,这款手机主打一个“无 App”,它清除了屏幕上的密密麻麻的 App 图标,只留有一个按钮用来激活手机里的 AI 助手,让用户通过类似 ChatGPT 的操作界面来交互。

【OpenCV 例程 300篇】224. 特征提取之提取骨架_骨架提取-程序员宅基地

文章浏览阅读5.8k次,点赞5次,收藏53次。骨架可以由区域的边界计算。提取骨架的常用方法是用重建开运算来实现。skimage 中提供了函数 **skimage.morphology.skeletonize** 可以获取图像的骨骼。_骨架提取

mysql blob类型导致中文乱码_blob类型中文乱码无效-程序员宅基地

文章浏览阅读3.1k次。做前端富文本时遇到的问题之一,保存后,中文乱码。在前段端一顿操作后,调试中发现是blob类型导致解析乱码看到一篇文章代码都不用写2分钟搞定,下面是原文链接blog链接解决办法如下,建个工具类,mapper配置下完美解决public class ConvertBlobTypeHandler extends BaseTypeHandler<String> { //指定字符..._blob类型中文乱码无效

随便推点

echarts x轴一个数据;y轴左边数值,右边百分比。(柱状图)_echarts柱状图右侧带百分比-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏9次。大概样子如下:配置代码如下:export const gateChartConfig = function() { return { color: '#ED7D31', xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], axisTick: { _echarts柱状图右侧带百分比

基于角色管理的系统访问控制 _访问控制使用的二元组是什么-程序员宅基地

文章浏览阅读1.4k次。1. 引言(Introduction) 1.1. 关键词定义(Definitions)有关定义说明如下:安全管理:计算机技术安全管理的范围很广,可以包括网络安全性、数据安全性、操作系统安全性以及应用程序安全性等。很多方面的安全性管理大都已经有成熟的产品了,我们只需根据自己需要有选择性的使用就_访问控制使用的二元组是什么

微服务项目框架及多模块开发_微服务电商项目模块划分-程序员宅基地

文章浏览阅读729次。电商模式:市面上有5种常见的电商模式,B2B、B2C、C2B、C2C、O2O;1.B2B模式B2B(Business to Business),是指 商家与商家建立的商业关系。如:阿里巴巴2.B2C模式B2C(Business to Consumer),就是我们经常看到的供应商直接把商品卖给用户,即“商家对客户”模式,也就是通常说的商业零售,直接面向消费者销售产品和服务。如:苏宁易购、京东、天猫、小米商城。3.C2B模式C2B(Customer to Business),即消费者对企业(客户对商家)。_微服务电商项目模块划分

hive的几种存储格式_hive数据库后缀-程序员宅基地

文章浏览阅读308次。Text/CSVcsv文件不支持块压缩,所以在Hadoop中使用压缩的CSV文件经常会带来很低的读性能。无法存储元数据。新的字段只能追加到所有字段的尾部,并且不能产出已经存在的字段。支持有限的模式演进。JSON能够存储元数据。不支持块压缩。第三方的JSON SerDe工具能解决这些问题。全面支持模式演进。AvroAvro是Hadoop平台多功能的数据存储格式。它能够存储元数据,还可以把元数据单独存储到一个文件中。支持模式演进。因为Avro可以通过定义一个新的独立的模式文件来重命名、增加、删除和修改_hive数据库后缀

Drupal theme-1-程序员宅基地

文章浏览阅读875次。修改Drupal生成的HTML或者其他标识字体,你需要深入的了解主题系统的各个组成部分。主题系统是个优雅的架构,它可使你绕过核心代码,但是它有一个很长的学习曲线,特别是在你想使你的站点于其他drupal站点看起来不同时。我们将向你讲述主题系统是如何工作的,以及想你展示隐藏在Drupal核心本后的一些最佳实践。首先要记住的是:不要通过编辑模块文件内部的HTML来改变你站点的外观。如果这样做了,你仅仅

JAVA文件上传多方式_java文件上传读取文件-程序员宅基地

文章浏览阅读2.7k次,点赞5次,收藏3次。JAVA文件上传多种方式_java文件上传读取文件

推荐文章

热门文章

相关标签