React跨域解决方案

Posted 凉亭下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React跨域解决方案相关的知识,希望对你有一定的参考价值。

一、跨域日志报错

我们由于项目需要经常会需要对不同域名、不同子域的网站接口发起请求,有时甚至是对于同一域名的不同端口发起请求,此时我们经常看到以下报错: 

Access to XMLHttpRequest at 'xxx' from origin 'xxx' has been blocked by CORS

policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

是的,错误的原因就是你跨域了。

二、为什么会有跨域问题?

看到网上举的一个形象例子,先设想下,如果允许跨域,那么黑衣人是不是可以在自己的网页上把请求转发给其他网站?例如,黑衣人在自己的页面设计了一个跨域请求到某钱堆的网址,当用户访问黑衣人网址时,浏览器按照黑衣人设计去访问了钱堆(还携带了用户在钱堆那儿的cookie)......之后,之后警察叔叔们又要加班了。还有诸如此类许多安全隐患。所以后来的浏览器都开始实行同源策略。 

同源策略,其实就是只允许相同协议+域名+端口号(如存在)的HTTP请求互相访问。这么理解其实就够了。关于跨域资源共享标准( cross-origin sharing standard )CORS的详细内容

三、怎么解决跨域问题?

这里我给出两种React的跨域解决方案(React16.9),第一种比较实用,第二种需要服务端协调。

很多以前的资料写的直接在package.json中配置proxy的,这个方法已经失效很久了。官方给出的新版本解决方案需要借助http-proxy-middleware这个包。

1. 方法一: 使用 http-proxy-middleware

1> . 添加组件

npm install  --save http-proxy-middleware

2>. src目录下创建setupProxy.js,配置如下:

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

module.exports = function (app)  

       // proxy第一个参数为要代理的路由   第二参数中target为代理后的请求网址,                   

       // changeOrigin是否改变请求头,其他参数请看官网  baidu

       app.use(createProxyMiddleware('/cityjson',  

               target: 'http://pv.sohu.com',                                                                                                            

               changeOrigin: true,                                                                                                                 

        )); 

3>. 测试一下:

// 页面代码:

import React, useEffect,useState from 'react';

import axios from 'axios'; 

function App()  

       const [ip,setIp] = useState(); 

       axios.get('/cityjson').then((res) =>

        console.log(res.data); 

         setIp(res.data.toString());

    ).catch(function (error)  

          console.log(error); 

    ); 

   return (<h1>获取的IP信息:ip</h1>) ;

 

export default App;

成功获取! web页面显示:

获取的IP信息:var returnCitySN = "cip": "117.136.83.208", "cid": "CN", "cname": "CHINA";

2.借助服务端配置

解决react项目中跨域和axios封装使用

最新几天学了一下react,发现了几个问题,估计新入坑的同学们也会遇到,下面我先列出来几点

1、请求跨域问题

2、如何发起请求

3、axios的简单封装

 


全局安装create-react-app脚手架,帮助我们新建react项目

npm install -g create-react-app

然后创建react项目

create-react-app xxx项目名

然后安装依赖,并且运行react项目

安装 npm install

运行 npm start


 

首先我们解决跨域的问题

打开项目生成的package.json文件,修改文件内容如下

如果你赖一点可以这样写

完整写法

这样就可以解决跨域问题。

接下来开始讲一下如果在react中使用axios

首先安装axios

npm install axios --save-dev

方法一:

然后在我们的src目录下新建一个server.js的文件写下如下代码

然后我们就可以在react组件上使用我们的axios

随便写一个react组件,然后引进我们的刚刚封装的server.js,先写一个登录的函数,然后在组件渲染完之后执行该函数

打开浏览器查看返回结果

方法二:

我们可以先把所有的api都列出来,然后在用export导出去,如下

组件中使用

浏览器结果

看到上面的结果,说明我们已经成功决解跨域问题并且拿到了后台返回的数据。是不是很简单,赶紧自己动手试一试吧。

以上是关于React跨域解决方案的主要内容,如果未能解决你的问题,请参考以下文章

React.js

React css-in-js

react.JS基础

基于 React.js 和 Node.js 的SSR实现方案

React JS - 请求的资源上不存在“Access-Control-Allow-Origin”标头。跨域资源错误

前端框架重新带你了解React.js