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. Ubuntu系统Root用户无法登录

    默认 系统 root 登录 图形界面,出现 登录失败.解决方法如下: 1,登录普通用户, 打开终端执行命令, 使用su root或sudo -i切换到root用户(必须) su root 按照提示输入 ...

  2. Java之JSP

    JSP JSP简介 JSP指的是 JavaServerPages ,Java服务器端页面,也和Servlet一样,用来开发动态web JSP页面中可以嵌入java代码为用户提供动态数据 JSP原理 J ...

  3. Windows注册表内容详解(转载)

    (关于windows注册表的整理,来源网络) 前提 一.什么是注册表 ​ 注册表是windows操作系统.硬件设备以及客户应用程序得以正常运行和保存设置的核心"数据库",也可以说是 ...

  4. K8s 部署 Gitlab CI Runner

    K8s 版本:1.20.6 GitLab CI 最大的作用是管理各个项目的构建状态.因此,运行构建任务这种浪费资源的事情交给一个独立的 Gitlab Runner 来做就会好很多,而且 Gitlab ...

  5. STM32—4线SPI驱动SSD1306 OLED

    文章目录 一.OLED简介 二.驱动SSD1306所需知识 1.引脚介绍 2.通信时序 3.显存GRAM 4.字库 5.SSD1306基本命令 三.代码讲解 1.相关引脚配置 2.模拟SPI通信 3. ...

  6. Django 反向解析 request CBV

    正则路径中的分组 无名分组 分组的概念:就是给某一段正则表达式用小括号括起来 无名分组按位置传参数,一一对应. view中除去request,其他形参数量要与urls中分组数量一致. 无名分组就是将括 ...

  7. uwp 自定义语音识别规则

    xml  code ---------------------------------------------------- <Page x:Class="MyApp.MainPage ...

  8. 深入浅出Mybatis系列(十)---延迟加载

    一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先 ...

  9. 12-SpringCloud GateWay

    GateWay和Zuul说明 Zuul开发人员窝里斗,实属明日黄花 重点关注Gate Way GateWay是什么 上一代zuul 1.x官网 Gateway官网 概述 Cloud全家桶中有个很重要的 ...

  10. github push报LibreSSL SSL_connect错误

    最近发现在家里push代码到github的时候总是报错,报错内容如下: fatal: unable to access 'https://github.com/MangoDowner/clear-le ...