跨域问题解决方案

在Web开发的时候会遇见一个常见的问题,跨域问题,这也是前后端分离的场景常见的问题,下面来看看这个东西是啥,如何应用的吧?

技术派中的跨域问题,有两处,一处是加载CDN图片时;一处是admin端请求后端API接口时。

来看看跨域问题的解决思路和发生原因吧。

什么是跨域问题

跨越对于前后端开发者来说,像一块狗皮膏药,无论是面试还是开发中,都会经常遇到。

之所以出现跨域问题,是因为浏览器的同源策略,为了隔离潜在的恶意文件,为了防御五花八门的攻击,浏览器限制了从同一个源加载的文档或者脚本与来自另一个源的资源进行交互。

同源策略要求,如果两个网页的协议、域名和端口都相同,他们才会认为是同源,否则就是跨域。

同源策略是浏览器为了保护用户信息安全而实施的一种安全机制,可以防止恶意网站通过脚本窃取用户在其他网站上的数据,或者伪造用户身份执行一些操作。

现在有一个Web应用,运行在5174端口下,它有一个login请求,请求的是8080端口,那么就会出现跨域问题。

演示一下?

1.运行技术派,以便提供后端服务。技术派默认是运行在8080端口下的。

2.安装Node.js,是一个基于ChromeV8 JavaScript引擎的开源、跨平台的运行时环境,它允许在服务器端运行JavaScript代码。在它出现之前,JavaScript京仅仅支持浏览器端,用于处理客户端逻辑与用户互动,它的出现极大的扩展了JavaScript的使用范围,使其成为了以哦个全站的开发语言。

3.通过命令创建一个新的Vite + React应用。

进入my-app目录:

安装依赖:

在Src的目录下面编辑如下内容:

import { useState } from 'react';
import reactLogo from './assets/react.svg';
import viteLogo from '/vite.svg';
import './App.css';function App() {const [response, setResponse] = useState<string>('');const handleLogin = async () => {try {const res = await fetch('http://localhost:8080/api/admin/login', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({username: 'your-username',password: 'your-password',}),});const data = await res.json();setResponse(JSON.stringify(data));} catch (error) {console.error('Error:', error);setResponse('An error occurred');}};return (<div><button onClick={handleLogin}>Login</button><p>{response}</p></div>);
}export default App;

运行Vite,Vite(快)是一个现代化的、轻量级的、基于浏览器的原生ES模块开发工具,Vite由Vue.js创始人尤雨溪开发,旨在为前端带来更快的构建速度和更高的开发效率。:

此时,在浏览器中访问  http://localhost:5174/ 你将在控制台看到跨域的错误,因为前端应用(在5174端口)正在尝试访问非同源的后端服务(在8080端口)。这个就时带典型的跨域问题。

如何让解决跨越问题呢?

理解啦跨越问题的发生原因,解决就显而易见了。

我们可以使用Node.js代理来解决跨域问题,思路即是,在本地创建一个虚拟的服务器,对5174端口下面的前端请求进行代理,同时接受8080端口下的服务端响应,这样服务端和服务端进行数据交互就不会出现跨域问题了。

在vite.config的server配置中

添加代理配置。

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'// https://vitejs.dev/config/
export default defineConfig({plugins: [react()],server: {proxy: {"/admin": {target: "http://127.0.0.1:8080/",changeOrigin: true,rewrite: path => path.replace(/^\/api/, ""),},},},
})

他将所有以/admin开头的请求转发到 http://127.0.0.1:8080/ 

  • proxy: 一个包含代理规则的对象。
  • /admin: 指定要代理的路径前缀。所有以/admin开头
  • target: 目标服务器的URL,所有匹配的请求将会被转发到此URL
  • changeOrigin: 设置为true时,代理会修改请求头中的Host,使其与目标服务器一致。

有助于避免某些服务器对Host头进行验证情况。

rewrite:一个函数,用于重写请求路径。在这个例子中,他会移除路径中的/api部分。例如,一个请求路径为/admin/some-endpoint的请求将会被代理到http://127.0.0.1.8080/some-endpoint。

运行技术派的admin端

简单总结一下,通过同源服务器上设置代理(Nginx,Node.js),将请求转发到服务器上,这样客户端和代理服务器之间就可以满足同源策略,而代理服务器与目标服务器之间的通信就不再收到同源策略的限制,做法很简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538639.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什localhost被forbidden而127.0.0.1不被绊?

原因&#xff1a; 判段网关的时候判127.0.0.1&#xff0c;所以最好改localhost 其他参考&#xff1a; 【计算机网络】localhost不能访问&#xff0c;127.0.0.1可以访问&#xff1f;_ping localhost和ping 127.0.0.1-CSDN博客

CesiumJS 沙盒

CesiumJS 沙盒 通过CesiumJS 沙盒快速测试CesiumJS的一些功能&#xff0c;免去安装开发环境的困恼。 Hello World https://sandcastle.cesium.com/index.html 简单修改&#xff08;F8运行&#xff09;&#xff1a;去掉界面上UI const viewer new Cesium.Viewer("cesi…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像&#xff08;C&#xff09; Baumer工业相机Baumer工业相机定序器功能的技术背景Baumer工业相机通过NEOAPI SDK使用定序器功能预期的相机动作技术限制定序器的工作原理 Baumer工业相机通过NE…

谁将主导未来AI市场?Claude3、Gemini、Sora与GPT-4的技术比拼

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…

软件设计师:06-程序设计语言与语言处理程序基础

章节章节01-计算机组成原理与体系结构07 - 法律法规与标准化与多媒体基础02 - 操作系统基本原理08 - 设计模式03 - 数据库系统09 - 软件工程04 - 计算机网络10 - 面向对象05 - 数据结构与算法11 - 结构化开发与UML06 - 程序设计语言与语言处理程序基础12 - 下午题历年真题End -…

扒带和扒谱的区别 FL Studio怎么扒带 扒带编曲制作 扒带简单歌曲

在许多业余音乐爱好者们的眼里&#xff0c;扒带和扒谱是同一种东西。诚然&#xff0c;扒带和扒谱的确非常相似&#xff0c;但是从严格的意义上来说&#xff0c;这二者还是有一定的区别。今天我们就来说一说扒带和扒谱的区别&#xff0c;FL Studio怎么扒带。 FL Studio21中文官网…

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…

【Python】使用plt库绘制动态曲线图,并导出为GIF或MP4

一、绘制初始图像 正常使用plt进行绘图&#xff0c;这里举例一个正弦函数&#xff1a; 二、绘制动态图的每一帧 思路&#xff1a; 根据横坐标点数绘制每一帧画面每次在当前坐标处&#xff0c;绘制一个点和垂直的线&#xff0c;来表示当前点可以在点上加个坐标等样式来增加…

新火种AI|GPT-4诞生1年,OpenAI把它放到了机器人上

作者&#xff1a;一号 编辑&#xff1a;美美 ChatGPT拥有了身体&#xff0c;机器人也有了灵魂。 从OpenAI在去年3月14日拿出GPT-4后&#xff0c;已经过了整整一年。显然&#xff0c;在GPT-4诞生之后的这一年&#xff0c;一切都迭代得太快了&#xff0c;从GPT-4展现多模态能力&…

力扣热题100_矩阵_73_矩阵置零

文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

SpringCloud微服务 黑马教程 自我总结笔记

来源出处&#xff1a; SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4/?spm_id_from333.337.search-card.all.click 一、认识微服务 微服…

BEV系列一:BEV介绍和常用BEV算法简介

BEV系列一&#xff1a;BEV介绍和常用BEV算法简介 自动驾驶最全学习资料获取&#xff1a;链接