当前位置: 首页 > news >正文

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.借助服务端配置

http://www.lryc.cn/news/57870.html

相关文章:

  • 内存五区的概念,内存池技术的诞生。
  • 力扣:字符串中的第一个唯一字符(C++实现)
  • 攻防世界 favorite_number mfw、[BJDCTF2020]ZJCTF,不过如此
  • SummingMergeTree
  • JUC并发编程基础篇第一章之进程/并发/异步的概念[理解基本概念]
  • c语言—指针进阶
  • 总结二分法
  • 二叉搜索树和AVL树
  • 计算机体系结构量化研究方法【2】高速缓存Cache
  • 初识设计模式 - 迭代器模式
  • 三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析
  • Eyeshot Ultimate 2023 Crack
  • JAVA-8-[SpringBoot]入门程序案例和原理分析
  • 前端工程化
  • 【redis】单线程 VS 多线程(入门)
  • 2023蓝桥杯Java研究生组赛题
  • 多维时序 | MATLAB实现CNN-BiLSTM-Attention多变量时间序列预测
  • 微积分——Rolle定理的理解(罗尔定理)
  • linux内核之select/poll/epoll
  • 文件流下载
  • C语言模拟实现:atoi函数
  • LeetCode.每日一题 2427. 公因子的数目
  • 蓝牙BQB认证 - HFP profile配置说明
  • 【接口测试工具】Eolink Apikit 快速入门教程
  • 使用Python和OpenCV实现实时人脸检测并保存截图
  • [linux kernel]slub内存管理分析(7) MEMCG的影响与绕过
  • MySQL创建数据库(CREATE DATABASE语句)
  • 【JavaWeb】4—Tomcat
  • 宝塔Linux面板部署Python flask项目
  • spring中产生bean的几种方式