跨域问题及常用的5种解决方案

1.什么是跨域问题?

跨域问题通常指的是在浏览器中由于同源策略的限制而产生的问题。同源策略(Same-origin policy)是浏览器的一种安全措施,它要求请求的域名、协议和端口必须与提供资源的网站相同。当一个网页尝试访问另一个来源(即不同域名、协议或端口)的数据时,那么后端返回给浏览器的数据被浏览器拦截下来,这就是跨域。

2.跨域问题演示?

在这里,不同的端口号意味着不同的“来源”(origin),因此即使它们都在 localhost 上运行,也会被视为来自不同的源。浏览器的同源策略会阻止从一个源发起的请求访问另一个源上的资源。

3.什么是同源策略?

同源策略(Same-origin policy)是浏览器的一项重要安全特性,用于控制不同来源的网页之间的交互。这项政策的主要目的是为了保护用户的隐私和数据安全,防止恶意网站执行某些恶意操作。

但在实际应用中,有些情况下需要跨域访问。以下是一些常用的跨域访问机制:

4..跨域问题的原因分析?

一般来讲,源由协议、域名和端口号组成。如果两个 URL 的协议、域名和端口号中任何一个不同,就被认为是跨域。通常产生跨域问题有以下几种原因:

  1. 协议不同:如 https和http;

  2. 端口不同

  3. 域名不同

这就是常说的同源策略的问题。产生跨域问题的根源就是请求不同源。

5.如何解决跨域问题?

我们在项目中解决跨域问题主要是通过Cors 机制,用于在Web浏览器中实现跨源资源共享。这是目前比较常用的方式,它的原理是通过在响应头中添加一些额外的字段,如 Access-Control-Allow-Origin 字段,添加允许跨域的源,类似于设置白名单之类的操作。

一、使用@CrossOrigin注解

  @CrossOrigin(origins="*", allowedHeaders = "*"methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE,RequestMethod.OPTIONS})

GraphQL

也可以在这个注解里添加允许的请求方法,就像上边这句代码一样

allowedHeaders = "*" 这段配置通常用于后端服务中,以确保客户端可以从不同的源发起请求,并且可以使用特定的HTTP头部。

OPTIONS方法: 用于预检请求,检查服务器是否允许特定的跨域请求。

了解预检请求:

CORS机制中的预检请求(Preflight Request)是浏览器为了确保跨域请求的安全性和兼容性而自动发送的一种特殊类型的HTTP请求。预检请求主要用于检查服务器是否允许特定类型的跨域请求。

预检请求的工作原理

  1. 客户端发送预检请求

  2. 浏览器发送一个 OPTIONS 方法的请求到目标服务器。

  3. 请求头中包含 Access-Control-Request-Method,指明客户端打算使用的HTTP方法。

  4. 请求头中包含 Access-Control-Request-Headers,列出客户端打算使用的自定义头部。

  5. 服务器响应预检请求

  6. 服务器应该返回一个200状态码的响应,表明请求被接受。

  7. 响应头中包含 Access-Control-Allow-Origin,指明允许的源。

  8. 响应头中包含 Access-Control-Allow-Methods,指明允许的HTTP方法。

  9. 响应头中包含 Access-Control-Allow-Headers,指明允许的自定义头部。

  10. 响应头中可包含 Access-Control-Max-Age,指明预检请求的有效期(秒)。

  11. 客户端发起实际请求

  12. 如果预检请求成功,浏览器会根据服务器的响应发送实际的跨域请求。

  13. 如果预检请求失败,浏览器将阻止实际请求的发送。

OPTIONS请求方法的主要用途有两个:

1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。

2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。

二、使用全局跨域配置

三.使用CorsFilter跨域

四.Node代理 ?

Node代理 是指用 Node 服务器代理客户端和目标服务器之间的网络请求。同源策略是浏览器需要遵循的标准,服务器与服务器之间没有同源策略,Node 代理服务器监听客户端请求,转发给目标服务器,再接收响应发给客户端。

只需在 vite.config.js 文件中配置开发服务器的自定义代理规则:

  server: {proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,}}},

GraphQL

五.使用Nginx来实现跨域

location /api {            add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS';             //OPTIONS方法通常用于预检请求(Preflight Requests),这是一种特殊的请求,用于检查服务器是否支持跨域请求及其相关参数。}

GraphQL

这里是我们在wms项目里打包部署服务器时的前端项目里配置Nginx的一个文件,

upstream wms-app {    server 192.168.21.92:8080; server 192.168.21.92:8081;
}server {    listen       80;    listen  [::]:80;    server_name  localhost;access_log  /var/log/nginx/host.access.log  main;location / {        root   /usr/share/nginx/html;        index  index.html index.htm;        try_files $uri $uri/ /index.html; #解决单页面找不到路径问题 404    }       location /api {            add_header 'Access-Control-Allow-Origin' '*';            add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS';            proxy_pass http://wms-app ;  #可以配置多个下游服务,具有负载功能            #proxy_pass http://192.168.14.3:3666; #仅配置一个下游服务,不具有负载均衡能力}    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }}

GraphQL

在讲完跨域后再扩展一下Nginx的配置吧

5.1 proxy_pass http:

当你需要将请求分发到多个后端服务器时,需要实现负载均衡功能,可以使用upstream指令定义一组服务器,并在proxy_pass中引用这个服务组名称。。如果不需要负载均衡,只需要将请求转发到单一的后端服务器,可以直接在proxy_pass指令中指定服务器地址。

5.2 proxy_set_header:

proxy_set_header是Nginx中的一个指令,用于在代理请求时设置或修改HTTP请求头。当你使用Nginx作为反向代理时,这个指令非常有用,因为它可以帮助你传递必要的信息给后端服务器。

设置Host头部:

proxy_set_header Host $host;

Plain Text

  • 由于Nginx可能监听多个不同的域名或端口,因此需要告诉后端服务器原始请求的目标主机名,当客户端向Nginx发送请求时,Nginx会自动填充$host变量的值

设置X-Real-IP头部:

proxy_set_header X-Real-IP $remote_addr;

Plain Text

为了确保后端服务器能够知道客户端的真实IP地址,而不是Nginx服务器的IP地址。

设置X-Forwarded-For头部:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Plain Text

这个头部用于记录客户端的IP地址及任何中间代理服务器的IP地址,这对于审计和跟踪请求非常有用

自定义其他头部:

通过 X-Custom-Header,你还可以设置自定义的头部信息;./'i

proxy_set_header X-Custom-Header "Some Value";i

Plain Text

5.3 Nginx作为服务端负载均衡器,常见的负载均衡算法

1. 轮询(Round Robin)

优点:

  • 简单易实现。

  • 适用于后端服务器性能相近的情况。

缺点:

  • 无法考虑服务器的负载情况。

  • 不适用于后端服务器性能差异较大的情况。

2..最少连接数(Least Connections)

最少连接数算法将请求分配给当前活动连接数最少的后端服务器。这有助于避免某些服务器过载,而其他服务器则处于空闲状态的情况。

3. IP哈希(IP Hash)

IP哈希算法根据客户端IP地址的哈希值将请求分配给后端服务器。这样,同一个客户端的请求总是被分配到同一台后端服务器,从而实现会话粘性(Session Persistence)。

优点:

  • 适用于需要会话粘性的场景。比如购物车应用或需要登录的应用程序。

  • 缓存一致性:如果后端服务器使用本地缓存来加速响应时间,那么使用 IP 哈希算法可以确保来自同一 IP 的请求始终命中相同的缓存实例,从而提高缓存的效率和命中率。

  • 减少后端服务器间的负载转移:在一些情况下,如果某个后端服务器正在进行数据库操作或其他需要较长时间的任务,将请求继续路由到该服务器可以避免在任务完成之前将请求转移到另一台服务器,从而减少不必要的负载转移。

缺点:

  • 负载分布不均衡,可能导致部分服务器负载过高。

4. URL哈希(URL Hash)

URL哈希算法根据请求URL的哈希值将请求分配给后端服务器。这样,相同URL的请求总是被分配到同一台后端服务器。

优点:

  • 适用于缓存场景,提高缓存命中率。

  • 简单实现URL粘性。

  • 静态内容优化:

对于静态内容如图片、CSS 和 JavaScript 文件,URL 哈希算法可以确保这些文件的请求始终被路由到相同的服务器,从而可以利用这些服务器上的缓存来提高加载速度。

缺点:

  • 负载分布不均衡,可能导致部分服务器负载过高。

5. 加权轮询(Weighted Round Robin)

加权轮询算法在轮询的基础上,为每台后端服务器分配一个权重。数字越大,权重越高,分配到的请求越多。适用于后端服务器性能差异较大的情况。

优点:

  • 考虑了服务器性能差异。

  • 灵活分配请求。

缺点:

  • 需要手动配置权重。

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

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

相关文章

基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

图论day62|拓扑排序理论基础、117.软件构建(卡码网)、最短路径之dijkstra理论基、47.参加科学大会(卡码网 第六期模拟笔试)

图论day62|拓扑排序理论基础、117.软件构建(卡码网)、最短路径之dijkstra理论基、47.参加科学大会(卡码网 第六期模拟笔试) 拓扑排序理论基础117.软件构建(卡码网)最短路径之dijkstra理论基础47.参加科学大…

IT招聘乱象的全面分析

近年来,IT行业的招聘要求似乎越来越苛刻,甚至有些不切实际。许多企业在招聘时,不仅要求前端工程师具备UI设计能力,还希望后端工程师精通K8S服务器运维,更有甚至希望研发经理掌握所有前后端框架和最新开发技术。这种招聘…

day-67 二叉树展开为链表

思路 深度优先遍历:首先将二叉树进行前序遍历,将每个遍历的节点存入一个链表当中 解题过程 将链表还原为只有右子树的二叉树即可 Code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* Tr…

Hi3061M开发板——系统时钟频率

这里写目录标题 前言MCU时钟介绍PLLCRG_ConfigPLL时钟配置另附完整系统时钟结构图 前言 Hi3061M使用过程中,AD和APT输出,都需要考虑到时钟频率,特别是APT,关系到PWM的输出频率。于是就研究了下相关的时钟。 MCU时钟介绍 MCU共有…

认识Java的异常

异常机制 异常机制指的是程序出现错误时,程序的处理方式。 程序的错误分为三种: 编译错误:由于没有遵循对于语言的语法规则,编辑器可以自动发现并提示的错误位置和原因。逻辑错误:程序没有按照预期的顺序执行。运行…

FreeRTOS应用开发学习

了解FreeRTOS 任务相关API FreeRTOS任务创建API FreeRTOS 中,任务的创建有两种方法,一种是使用动态创建,一种是使用静态创建。动态创建时,任务控制块和栈的内存是创建任务时动态分配的,任务删除时,内存可…

申请商家转账到零钱功能所需材料及必过攻略

商家转账到零钱功能的快速开通方法,可以归纳为以下几个步骤: 一、确认商户资格与账号状态 1. 商户类型:该功能通常只对公司性质的商户开放,个体工商户及小微商户暂时无法申请。商家需为微信支付认证用户。 2. 账号状态&#xff…

网络层及ip报头

★★★★★默写: A类:0~127 B类:128~191 C类:192~223 A类私网:10.0.0 - 10.255.255.255 B类私网:172.16.0.0 - 172.31.255.255 C类私网:19.168.0.0 - 192.168.255.255 特殊: 0.0.0…

新手爬虫DAY1

这个错误信息表明在你的Python程序中,re.search() 函数没有找到预期的匹配项,因此返回了 None。当你尝试在 None 对象上调用 group(1) 方法时,Python 抛出了一个 AttributeError。 具体来说,错误发生在 pc.py 文件的第6行&#x…

AI大模型与相对论的结合点的思考、应用及相对论原理与公式表达

大家好,我是微学AI,今天给大家介绍一下AI大模型与相对论的结合点的思考、应用及相对论原理与公式表达。在阐述相对论原理的基础上,通过数学复杂公式,分析了人工智能大模型在相对论领域的应用前景。文章深入挖掘了两大领域之间的联…

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮

厨房老鼠数据集:掀起餐饮卫生监测的科技浪潮 摘要:本文深入探讨了厨房老鼠数据集在餐饮行业卫生管理中的重要性及其相关技术应用。厨房老鼠数据集通过收集夜间厨房图像、老鼠标注信息以及环境数据,为深度学习模型提供了丰富的训练样本。基于…

MongoDB 安装配置及配置和启动服务

MongoDB 安装配置 附:MongoDB官网下载地址: https://www.mongodb.com/download-center/community 注: 官网可以下载最新版的MongoDB安装包,有MSI安装版和ZIP安装版。我们课堂上使用4.4.4的ZIP安装版。安装版参考博客&#xff1…

Spark第一天

MapReduce过程复习 Spark由五部分组成 RDD五大特征 1、 Spark -- 代替MapReduce <<<<< scala是单机的&#xff0c;spark是分布式的。>>>>> 开源的分布式计算引擎 可以快速做计算 -- 因为可以利用内存来做一些计算 (1) 分为5个库(模块) : 1、…

安装指定node.js 版本 精简版流程

首先 我们本机上是否安装有node 如果有 需要先卸载 卸载完成后 使用命令查看是否卸载干净 打开WinR 输入cmd 然后输入如下名: where node 如果没有目录显示 说明node 很干净 本机没有相关安装 在输入命令: where npm 如果有相关目录 需要删除掉 要不然 后续安装的…

基于华为昇腾910B,实战 InternLM2.5-7B-Chat 模型推理

本文将带领大家基于启智平台&#xff0c;使用 LMDeploy 推理框架在华为昇腾 910B 上实现 internlm2_5-7b-chat 模型的推理。 GitHub - InternLM/lmdeploy: LMDeploy is a toolkit for compressing, deploying, and serving LLMs.&#xff08;欢迎star&#xff09; GitHub - I…

Opencv库的安装与vs项目配置

目录 一、下载安装opencv 1、下载 2、减压安装 3、环境变量配置&#xff08;vs项目不是必须的&#xff0c;看后面&#xff09; 二、vs项目配置opencv 1、创建vs项目 2、包含opencv头文件 一、下载安装opencv 1、下载 OpenCV - Open Computer Vision Library 2、减压安…

k8s杂记

在node节点内部使用kubectl&#xff1a; rootmultinode-demo-m02:/# ps aux | grep kubelet root 218 3.1 1.6 2066316 62516 ? Ssl 07:35 0:29 /var/lib/minikube/binaries/v1.30.0/kubelet --bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.con…

phpstorm+phpstudy 配置xdebug(无需开启浏览器扩展)

今天又被xdebug折磨了&#xff0c;忘记了以前咋配置了现在百度发现好多都是各种浏览器扩展而且也没有真正的用到项目上的都是测试的地址怎么样的 我就简单写一下自己实战吧 不支持workerman swoole hyperf等这种服务框架 如果你会请教教我 工具版本phpstudy8.1.xphpstorm2021.x…

PAT甲级-1127 ZigZagging on a Tree

题目 题目大意 给出一棵树的中序和后序遍历&#xff0c;要求按层序输出这棵树&#xff0c;但是按照从左到右&#xff0c;再从右到左&#xff0c;再从左到右的顺序。 思路 由中序遍历和后序遍历可以构造出一棵二叉树。观察题目中要求的输出顺序&#xff0c;发现层数为奇数的都…