React中处理跨域问题
1. 跨域
跨域问题是前台浏览器造成的,同源策略。两个 URL 的“协议/主机(域名)/端口元组”一致,即同源。
React App在本机 3000 端口上运行
2. 解决办法:
1. cors
: 后台服务器端解决
//以Node服务器举例
const express = require("express");
const cors = require("cors")
const app = express();
// 允许跨域
// Access-Control-Allow-Origin: *
app.use(cors())
2. jsonp
需要使用插件:fetch-jsonp
(使用Fetch请求的话,使用该插件)
使用步骤:
1. 下载:`npm i fetch-jsonp`
2. 引入到页面中
`import fetchJsonp from 'fetch-jsonp'`
3. 使用
```js
// 引入fetchJsonp
import fetchJsonp from "fetch-jsonp"
fetchJsonp("http://localhost:3005/news?type='国际新闻'")
.then(res=>res.json())
.then(res=>{console.log(res)})
```
后台需要支持`jsonp`,express中只需要 `res.jsonp() `即可
```js
//Node
// JSONP接口
app.get("/news", (req,res) => {
res.jsonp({
type: req.query.type,
list: [{
id: 1,
title: "xxx新闻"
}]
})
})
```
3. 代理 Proxy
-
让后台请求后台,是没有跨域问题的
-
前台请求的指定位置是不存在跨域问题的
-
react
有两种形式实现代理
方法一
在package.json中追加如下配置
"proxy":"http://localhost:5000"
说明:
- 优点:配置简单,前端请求资源时可以不加任何前缀。
- 缺点:不能配置多个代理。
- 工作方式:上述方式配置代理,当请求了3000不存在的资源时,那么该请求会转发给5000 (优先匹配前端资源)
方法二
-
第一步:创建代理配置文件
在src下创建配置文件:src/setupProxy.js
-
编写setupProxy.js配置具体代理规则:
const proxy = require('http-proxy-middleware') module.exports = function(app) { app.use( proxy('/api1', { //api1是需要转发的请求(所有带有/api1前缀的请求都会转发给5000) target: 'http://localhost:5000', //配置转发目标地址(能返回数据的服务器地址) changeOrigin: true, //控制服务器接收到的请求头中host字段的值 /* changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000 changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:3000 changeOrigin默认值为false,但我们一般将changeOrigin值设为true */ pathRewrite: {'^/api1': ''} //去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置) }), proxy('/api2', { target: 'http://localhost:5001', changeOrigin: true, pathRewrite: {'^/api2': ''} }) ) }
说明:
- 优点:可以配置多个代理,可以灵活的控制请求是否走代理。
- 缺点:配置繁琐,前端请求资源时必须加前缀。
请求写法
中间件配置的代理名称(/api
) + 真实的接口地址
```js
// proxy代理,setupProxy.js
//加上代理路径 /api
proxyFun2(){
fetch("/api1/user/3120180905406").then(res => res.json()).then(res => {
console.log(res);
})
}
```
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步