概述

使用  vue-cli  工具生成一个  vue  项目:

vue init webpack my-project-vue

在生成的项目结构里,会有一个  index.js  文件。在这个文件里,会有一个  proxyTable  的空节点.

理解这个节点的作用需要有两个前置知识:

  • 前端跨域
  • 利用代理服务器进行跨域

proxyTable

proxyTable  是  vue-cli  脚手架在开发模式下,引用了  webpack-dev-server  工具,它为本地开发提供了一个用来跨域的代理中转服务器服务,基于它引用的中间件 http-proxy-middleware  提供了跨域服务。

为什么要用  proxyTable  ?

在开发期间与我们协作的后端开发可能没有给自己的服务 (接口) 提供  CORS  跨域服务,而浏览器存在同源策略,我们通过超文本语言在浏览器发出的  httpRequest  会被该策略拦截服务响应。而服务器是不存在这一策略的,所以才存在防火墙这一工具,协同后端开发一起关闭防火墙* 以后通过代理服务器中转对方本地的接口服务到代理服务器监听的本地端口,以此便可以实现跨域请求服务。以下简单举出几个需要跨域的例子:

  • 端口不同(同一设备启动不同服务):前端192.168.0.1:1111 - 服务192.168.0.1:2222
  • 网段不同(同一局域网内不同设备):前端192.168.0.1 - 服务192.168.0.2
  • 内网不同(不同局域网的不同设备):前端192.168.0.1 - 服务192.168.1.1
  • 网络不同(交换机分配的局域网通过共用的公网IP请求广域网):前端192.168.0.1 - 服务218.1.1.1

需要跨域的应用场景基本都含括在以上情况中。

如上图,由于浏览器的同源策略我们无法通过 httpRequest  跨域请求服务,浏览器截获了这次服务的响应,没有返回给页面。

解决的办法有三个:

  • 协商后端开发人员为他本地的接口开启  CORS  服务。
  • 通过代理服务器中转请求,vue请求的仍然是自己的后台,再由没有同源策略的代理后台去请求真正的后台,再由代理后台将数据返回给vue,这里的代理后台可由 proxyTable 、 Nginx 等工具或插件提供 。
  • 通过JSONP进行跨域,如我们在一个简单的html页面中引入 jQuery 或 BootStrap 等外部包时,只需要通过  script  标签引入目标源路径即可,可以看出这种方式是不存在同源策略的,我的另一篇文章API:获取当前用户的公网IP就是通过JSONP的方法访问到第三方在公网上提供的API并返回了数据。

访问一个不支持跨域的后台服务接口

这里用  node.js  写一个简单的http服务,端口号为54321,服务会返回一个  json  数据,但并不提供跨域功能。

const http = require('http')
const fs = require('fs') http.createServer((request, response) => {
console.log(request.url)
// 对于所有请求,都返回这个json数据.
fs.readFile('./json.data.json', 'utf-8', (err, data) => {
response.end(data)
})
}).listen(54321, () => {
console.log(`server is running at 54321`)
})

通过ip直接访问测试:

接着通过  vue-cli  创建一个服务端口为8080的  vue  项目后,在  App.vue  里修改代码:

created() {
this.axios.get('http://localhost:54321/json.data.json')
.then(response => {
this.users = response.data.todoList
console.log(this.users.todoList)
})
.catch(error => {
console.log(error)
})
},

不出意外提示跨域了 (vue:8080) & (json.data:54321)

假设这个后台是后端开发写的,在一个公司只有零星几个项目的情况下,并且有多位前端同时,可以协商后端开发为接口提供跨域服务。

但如果公司有很多个项目,或是离职的人 / 其他公司的人写的,我们无法协商让他们为服务提供  CORS  来支持跨域,那么就理应我们对项目配置跨域来进行开发和维护。


配置proxyTable进行跨域

proxyTable  跨域的基本原理是:

在开发模式下, webpack 会为我们提供一个 http 代理服务器.
我们请求接口的时候,实际上是请求的 webpack 提供的这个 http 代理服务器.
再由这个代理服务器请求真正的接口服务器.
最后数据经由 webpack 代理服务器,最后转交给我们的 vue 程序.

为什么在流程中加一个代理服务器就可以了?

如上文所说,服务器不同于浏览器,没有同源安全策略的限制。了解了跨域的基本原理,接着配置  proxyTable  节点的配置属性。

proxyTable: {
  // 这里配置 '/api' 就等价于 target , 我们在链接里访问 /api === http://localhost:54321
  // 代理需要一个标识,告诉代理服务器某个路径需要代理,否则可能项目的 html、css、js 这些静态资源也会从目标服务器代理到本地服务
  // '/api': {} 中的 /api 可以理解为全局关键字,表示target下的所有接口需要代理服务器中转,如果是 /apis ,则表示以 /apis 开头的接口
  '/api': {
    target: 'http://localhost:54321/', // 我们要请求的目标服务器
    secure: true, // 如果是 https ,需要开启这个选项.
    changeOrigin: true, // 是否是跨域请求.
    pathRewirte: {
      // 这里是追加链接,英文直译过来就是它的作用:路径重写、重定向.
      // 如果没有重定向我们访问的将是: 'http://localhost:54321/api/json.data.json
      // 将 /api 重写为空字符串 我们就能请求到正确路径: 'http://localhost:54321/json.data.json'
      '^/api': '',
    }
  }
},

该功能由  http-proxy-middleware  提供,详细的  proxyTable  配置请查看官方文献http-proxy-middleware.


配置Nginx进行跨域

Nginx  作为一个高性能的  HTTP  和  反向代理  的web服务器,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。

同时它非常的轻量级,其特点是占有内存少,并发能力强,在中国大陆使用  Nginx  的网站用户有:百度、京东、新浪、网易、腾讯、淘宝等,可见其稳定和性能有多强大。

Nginx  由于应用场景多存在于服务器,一般为后端开发人员熟知,但其  反向代理  功能也可以使本地页面实现跨域,也因此被前端开发人员熟知。

前端配置跨域操作可通过我的另一篇文章 Nginx:多项目开发配置跨域代理 查看,该文详细介绍了整个配置的操作,非常的简单快捷。

- END -

VUE006. 前端跨域代理服务器ProxyTable概述与配置的更多相关文章

  1. 如何实现vue前端跨域,proxyTable解决开发环境前端跨域问题

    在开发环境与后端调试的时候难免会遇到跨域问题,很多人说跨域交给后端解决就好了. 其实不然,前端也有很多方法可以解决跨域,方便也快捷. 常见的有nginx转发.node代理. 在vue项目中常用的是pr ...

  2. 【Nginx】在Windows下使用Nginx解决前端跨域问题

    提出问题:因为一些历史原因,后台代码不能动.请求别人的接口拿数据显示在前端,怎么办呢? 分析问题:通过ajax请求. 解决问题:因为浏览器的同源策略,所以需要解决跨域问题.(同源策略:请求的url地址 ...

  3. 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理

    什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...

  4. vue 解决axios请求出现前端跨域问题

    vue 解决axios请求出现前端跨域问题 最近在写纯前端的vue项目的时候,碰到了axios请求本机的资源的时候,出现了访问报404的问题.这就让我很难受.查询了资料原来是跨域的问题. 在正常开发中 ...

  5. 前端跨域(二):JSONP

    上一篇文章 前端跨域(一):CORS 实现了跨域的一种解决方案,IE8 和其他浏览器分别通过 XDomainRequest 和 XHR 对象原生支持 CORS.这次我将补一补 Web 服务中也非常流行 ...

  6. 前端跨域(一):CORS

    上周做了一个移动端表单提交的页面,其中涉及到了跨域问题,想来也是惭愧,因为之前一直都没有遇到过这个问题,因此都没有深入探索过,只是知道有哪几种方式,这次终于借这个机会可以把遗留的知识点补一补了. 1. ...

  7. JAVA解决前端跨域问题。

    什么是跨域? 通俗来说,跨域按照我自己的想法来理解,是不同的域名之间的访问,就是跨域.不同浏览器,在对js文件进行解析是不同的,浏览器会默认阻止,所以 现在我来说下用java代码解决前端跨域问题. 用 ...

  8. 用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面

    用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面 1.什么是跨域以及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地 ...

  9. 项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题

    一.xftp无法连接服务器 在xftp中配置正确的ip,用户名和密码后,居然无法连接 解决方案:将协议里面的FTP换成SFTP,注意换成SFTP后端口就默认换成22,要还是原来的21就还是连不上的哈 ...

随机推荐

  1. 【进阶之路】Java的类型擦除式泛型

    Java选择的泛型类型叫做类型擦除式泛型.什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会 ...

  2. centos7 下安装docker报错:You could try using...

    搞了台VPS,想要装docker,发现死活装不上,各种报错.之前系统是centos6,发现官方现在已经不支持centos6了,遂升级到centos7,然后还是出现下面这个错误. Error: Pack ...

  3. 字节跳动Android实习面试难吗,应该如何应对?

    字节跳动的面试难不难其实很难去非常准确的定义,但是能肯定的一点是,字节跳动的面试题都很有水平,真正考察了该岗位在以后工作中需要的能力. 大学学的Java后面又自学Android方向,跟着老师在实验室做 ...

  4. 深入理解jvm-2Edition-类文件结构

    概述: 规范而独立的类文件结构以及只与类文件关联的虚拟机为Java实现了平台无关性,甚至还带来了一些语言无关性. 只要将源代码编译为Class文件规定的格式,JVM就可以执行. JVM的指令描述能力比 ...

  5. 基于Gitea搭建属于自己的Git服务

    作者:IT王小二 博客:https://itwxe.com 一.搭建环境和前提 搭建环境: 操作系统:CentOS7.6 Docker版本:docker-ce-18.09.9 Lsky Pro版本:1 ...

  6. MyBatis学习02(配置解析)

    配置解析 核心配置文件 mybatis-config.xml 系统核心配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息. 能配置的内容如下: configur ...

  7. SpringCloud升级之路2020.0.x版-14.UnderTow AccessLog 配置介绍

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford server: u ...

  8. JmoVxia

    关于我 网名:季末微夏 英文:JmoVxia 签名:路漫漫其修远兮,吾将上下而求索 标签:iOS开发(ma)工程师(nong).技术爱好者 联系我 邮箱:JmoVxia@gmail.com Githu ...

  9. linux中文件内核数据结构

    3.文件io 3.1 文件内核数据结构 3.2 复制文件描述符的内核数据结构 3.3 对指定的描述符打印文件标志 #include "apue.h" #include <fc ...

  10. SQL 练习14

    查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 SELECT Student.SId,Student.Sname,t.不及格课程数,t.平均成绩 from Student, (SELECT ...