React中代理的配置

主要是解决同源策略的问题

何为同源策略?

  • 因为我们React在3000端口,Vue在8080端口,而后台接口往往在5000,这种不同的端口之间就是一种跨域的问题了

  • axios发送跨域请求的时候,实际上是有访问后台,并且从后台拿到了数据,只是这些数据回不了,因为ajax疫情拦截了

如何解决呢?

使用代理:

  • ①代理的端口和前端的端口是一样的(也就是下面的3000端口跑了一个脚手架,并且也运行了一个微小的代理服务器)

  • ②代理为什么能够请求别的端口的服务器是因为 代理服务器上面没有ajax引擎(因为产生跨域是因为ajax引擎把请求拦住了,

    而我们的代理就是基于没有ajax引擎,来进行转发的,所以代理拿到数据之后,因为和脚手架钱都都在同一个端口

    所以,脚手架的ajax引擎就允许接收这个数据了

在React中如何实现?

在react中有两种方式可以开启

方法一:在package.js中设置proxy代理

在package.json 中设置 "proxy": "http://localhost:5000",并重启脚手架

====这个相当于就是把所有给3000端口发的请求,都转发给了5000端口

但是代码中,我们写后台接口的时候,要写3000端口,而不是写5000(虽然我们后台在5000端口,但是我们这里设置了把3000端口发的请求转发到5000端口,其实就相当于这个localhost:3000就是和前端同一个端口的微型代理服务器,这个服务器会把我们给他的请求转发到5000端口中的后台接口中

getStudentData = () => {
axios.get('http://localhost:3000/students').then(
response => {console.log('成功了', response.data);},
error => {console.log('getStudentData方法失败了', error)}
)
}

注意点:

  • 如果写成 axios.get('http://localhost:3000/index.html') 这个请求并不会向5000端口发送,因为本地的public代表的就是3000端口,因为public有index.html,所以本地有的了,就不会和服务器请求了

  • 假如本地没有并且代理中转发给的服务器(5000)的也没有,那么就会报错404了

  • 缺点:就是只能配置一个服务器端口,3000没有就找5000,那假如又另外一个5001端口的服务器呢?

    • 这个时候就引入了第二种方法(为了配置多个端口的后台接口)

方法二:多后台接口代理配置

如果有多个服务器的话,就不能只是在packge.json中配置了

  • 在src目录下,新建一个 setupProxy.js 文件(名字不能更改)

  • 并且这个文件不能用ES6规范,而是要用CJS(commonJS)(因为这个文件不是给前端执行的,而是React会把这个文件加到webpack的配置文件里面,webpack里面用的是CJS的语法规范的)

const proxy = require('http-proxy-middleware')

module.exports = function(app) {
app.use(
proxy('/api1', {
target: 'http://localhost:5000',
changeOrigin: true,
pathRewrite: {'^/api1': ''}
}),
proxy('/api2', {
target: 'http://localhost:5001',
changeOrigin: true,
pathRewrite: {'^/api2': ''}
})
)
}

解释:

  • 如果不加/api1,那么就没有机会把请求发给5000,加了之后,也要进行消去

    • 所以就通过pathRewrite来消去

  • 全部的该前缀的请求都会被转发到目标服务器

  • changeOrigin: true, // 控制服务器收到的响应头中Host字段的值(host表示请求从哪发出来的),如果没加服务器那边的host显示从3000端口来的,如果加了就显示从5000端口来的(也就是欺骗服务器,我和你在同一个端口,你要给我数据)

所以请求的代码格式就是:

getStudentData = () => {
axios.get('http://localhost:3000/api1/students').then(
response => {console.log('成功了', response.data);},
error => {console.log('getStudentData方法失败了', error)}
)
}

相关注意事项:

  • 要么前端通过两个方式解决,要么就后端通过cors来解决跨域问题(但是其实真正用cors解决跨域的网站很少,存在安全性问题)

  • 注意了这个前缀api1一定要跟着3000的后面才行~

解决跨域、同源策略-React中代理的配置的更多相关文章

  1. vue cli 解决跨域 线上 nginx 反向代理配置

    前后分离 axios 接 api 跨域问题如图: 解决办法: 1. npm start 本地开发环境解决: 在webpack配置文件 /config/index.js 里找到 proxyTable 开 ...

  2. Vue-cli 创建的项目配置跨域请求(通过反向代理)---配置多个代理--axios请求

    问题描述: 使用 Vue-cli 创建的项目,开发地址是 localhost:8080,需要访问 localhost:9000 或https://m.maoyan.com或http://image.b ...

  3. 前端通过Nginx反向代理解决跨域问题

    在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...

  4. 前端解决跨域问题的终极武器——Nginx反向代理

    提到代理,分为:正向代理和反向代理. 正向代理:就是你访问不了Google,但是国外有个VPN可以访问Google,你访问VPN后叫它访问Google,然后把数据传给你. 正向代理隐藏了真实的客户端. ...

  5. windows环境下 nginx+iis 反向代理解决跨域问题

    项目基本完成,是时候花点时间整理一下最近的姿势了 1 什么是跨域? 网上对于跨域的概念会有大篇幅的文章去解释,似乎有点玄乎,初学者很容易对这个概念产生恐惧,跨域其实很简单,其实只要知道一点,无法跨域访 ...

  6. Nginx 反向代理解决跨域问题分析

    当你遇到跨域问题,不要立刻就选择复制去尝试.请详细看完这篇文章再处理 .我相信它能帮到你. 分析前准备: 前端网站地址:http://localhost:8080 服务端网址:http://local ...

  7. axios解决跨域问题(vue-cli3.0)

    一.什么是跨域 1.跨域 指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制. 2.同源策略 是指协议,域名,端口都要相同,其中有一个不同都 ...

  8. 【学亮IT手记】Ajax跨域问题精讲--jQuery解决跨域操作

    什么是跨域 跨域,它是不同的域名(服务器)之间的相互的资源之间的访问. 当协议,域名,端口号任意一个不同,它们就是不同的域. 正常情况下,因为浏览器安全的问题,不同域之间的资源是不可以访问的. 跨域的 ...

  9. 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离

    近年来,前后端分离已经成为中大型软件项目开发的最佳实践. 在技术层面,前后端分离指在同一个Web系统中,前端服务器和后端服务器采用不同的技术栈,利用标准的WebAPI完成协同工作.这种前后端分离的&q ...

随机推荐

  1. Set重写hashCode和equals方法实现引用对象去重

    运作原理: 首先判断hashCode是否相同,如果不同,直接判定为两个不同的对象.如果hashCode相同,再去比较equals是否一样,如果一样,则为同一个对象.如果不一样,则是两个不同对象. 那么 ...

  2. MySQL指定ip和端口连接数据库,并修改数据库密码

    一.指定ip和端口连接数据库 命令 mysql -u root -h (ip) -P (端口)-p 假设ip是:127.0.0.1:端口是:13326,连接的命令: mysql -u root -h ...

  3. spring cloud alibaba版本选择

    https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明 Spring Cloud Version Spring Cloud Version ...

  4. Windows莫名内存到百分之百,需要修改虚拟内存

    借鉴别人的操作: https://blog.csdn.net/xjpdf10/article/details/82849112

  5. ASP.NET Core教程:在ASP.NET Core中使用HttPClient调用WebService

    一.前言 在以前的一篇文章中,曾经讲述过如何在ASP.NET Core中调用WebService.但是那种方式是通过静态引用的方式去调用的,如果是在生产环境中,肯定不能使用这种方式去调用,幸运的是微软 ...

  6. 输入URL后浏览器的过程

    In this article, I want my readers to get a picture of a very basic concept of the web world. Previo ...

  7. 从eclipse转idea不适记录【持续更新】

    使用eclipse和idea时,快捷键对比 从一些最扎心的开始: 关于print一类的打印输出:System.out.println()补全 idea中可以sout.souf.serr:分别对应out ...

  8. js函数和封装

    $就是jquery对象,$()就是jQuery(),在里面可以传参数,作用就是获取元素 js对象与jQuery对象的区别:jQuery对象是一个数组,jQuery对象转为js对象:[0] 取第一个即可 ...

  9. VMware workstation16 中Centos7下MySQL8.0安装过程+Navicat远程连接

    1.MySQL yum源安装 2.安装后,首次登录mysql以及密码配置3.远程登录问题(Navicat15为例) 一.CentOS7+MySQL8.0,yum源安装1.安装mysql前应卸载原有my ...

  10. 关于ubuntu使用的那些事儿

    时间:2019-04-09 整理:PangYuaner 标题:Ubuntu18.04安装微信(Linux通用) 地址:https://www.cnblogs.com/dotnetcrazy/p/912 ...