为什么127.0.0.1和localhost之间算跨域?

原文:https://mp.weixin.qq.com/s/4zJBMNEntwjqAfN6A6diUA

什么是同源策略、跨域

跨域问题是指在浏览器中,当一个网页向不同域名、不同端口或不同协议的资源发起请求时,会受到限制。这是由浏览器的**同源策略(Same-Origin Policy)**所导致的安全限制。

同源策略规定,浏览器允许页面中加载的脚本只与其来源相同的资源进行交互,包括协议(http或https)、主机/域名(domain)、端口(port)

同源策略的主要目的是保护用户的隐私和安全,防止恶意网站通过脚本获取用户的敏感信息或执行恶意操作。如果没有同源策略的限制,恶意网站就可以通过脚本来读取用户在其他网站上的数据,或者在用户不知情的情况下执行一些危险的操作。

如果两个页面的协议、主机或端口有任何一个不同,就被认为是跨域请求,浏览器就会阻止页面获取到其响应

跨域请求示例

通常情况下,在跨域请求当中,涉及到两个请求过程,第一次是预检请求(OPTIONS请求),用于验证服务器是否允许跨域请求,服务器会在响应中携带头部信息给浏览器,浏览器再发送第二次实际的跨域请求,然后服务器接收请求后再进行处理,并在响应中包含必要的头部信息。

图片

注意:在一些特殊情况下,如果服务器已经配置允许来自所有源的请求(使用通配符 *),或者服务器与客户端位于同一源(同源请求),那么只会发送一次实际请求而不需要预检请求。但这通常不是最佳的安全做法,因为它可能会导致安全漏洞。

为什么127.0.0.1和localhost之间算跨域?

经过上面的了解,我们再回到刚开始的问题,为什么127.0.0.1和localhost之间算跨域?

实际就是浏览器的同源策略导致的。虽然它俩指向的都是同一个 IP 地址,即本地主机。

但从浏览器的角度来看,它们仍然被视为不同的域。这是因为浏览器在处理跨域请求时,会将协议+域名+端口号 作为标识符。很显然比如http://localhost:3000/http://127.0.0.1:3000/,它们的主机/域名(domain)是不一样的,因此会出现跨域。

如何解决跨域问题

法1:修改前端的请求URL

首先针对于上述出现的127.0.0.1localhost之间的跨域,最简单的办法就是将前端设置的请求url修改为localhost即可。如下是修改之后进行测试的结果:

图片

法2:spring提供的简化跨域配置的机制

Spring框架提供了一些简化跨域配置的方法,主要是通过Spring Web模块(通常与Spring Boot结合使用)来实现的。

1、使用@CrossOrigin注解:在Controller层,你可以为特定的处理方法或整个控制器类添加@CrossOrigin注解,以声明允许的跨域请求。

图片

2、使用全局配置:如果要在整个应用程序中配置跨域规则,可以使用全局配置。通过CorsRegistry来配置全局跨域规则。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("**") // 设置路径匹配模式.allowedOrigins("http://localhost:8080") // 允许的来源.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法.allowedHeaders("Origin", "Content-Type", "Accept") // 允许的HTTP头.allowCredentials(true) // 支持用户凭证.maxAge(3600); // 缓存时长}
}

在上面的示例中,我们创建了一个名为WebConfig的配置类,使用addCorsMappings方法定义了CORS规则,允许来自https://localhost:8080的跨域请求,并指定了允许的HTTP方法、请求头和缓存时间。

通过Nginx反向代理

在分布式项目当中,我们也可以通过Nginx反向代理来解决跨域问题:

在配置文件当中进行配置:

# 设置 HTTP 服务器
server {listen 80;server_name localhost;# 配置反向代理,将 localhost:8080 的请求转发到 localhost:8081location / {proxy_pass http://localhost:8081;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# 添加跨域头信息add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';# 处理 OPTIONS 请求的头信息if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain charset=UTF-8';add_header 'Content-Length' 0;return 204;}}
}

目前,跨域问题的解决方案有多种选择,但其中CORS(跨域资源共享)和服务器端代理是最常用的,它们具备良好的灵活性和安全性,适用于许多不同的应用场景。不过尽管有多种可行的方法,但我们仍然需要根据具体的情况来选择最合适的解决方案,以确保跨域问题能够得到有效解决。

总结

  • 跨域的必要性和重要性:跨域的必要性和重要性在于保护用户数据和隐私、维护互联网生态系统的安全和稳定。
  • 合适的跨域解决方案:根据具体的需求和环境,选择合适的解决方案来确保跨域请求的安全性、兼容性、功能性、性能和维护性。
  • 分布式系统当中的跨域:跨域在分布式系统当中尤为常见,分布式系统通常由多个独立部署的服务或模块组成,这些服务可能运行在不同的域名、主机端口上。当一个服务需要与另一个服务或模块进行通信时,就会涉及到跨域请求。这里大家可以入手我的分布式课程,里面内容丰富,能够帮助大家深入分析和解读代码当中的内在逻辑

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

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

相关文章

wps 表格如何实现vlookup高级模糊搜索

一、VLOOKUP 模糊搜索 在 WPS 表格中,可以通过使用 VLOOKUP 函数和通配符来实现高级模糊搜索。这里有一个具体的示例来帮助你理解如何进行这些操作。 示例:实现 VLOOKUP 高级模糊搜索 假设我们有以下数据集: AB产品编号产品名称001苹果00…

uniapp实现可拖动悬浮按钮(最新版2024-7月)

此章主要介绍如何使用uniapp跨平台开发,实现悬浮按钮,移动端经常会有所这样的需求,那么功能如下: 1.圆圈悬浮球,上下左右靠边显示 2.可以界面任何拖动,不会超出界面 3.单击悬浮球的点击事件 效果&#xf…

Ubuntu 22.04上编译安装c++ spdlog library

Very fast, header-only/compiled, C logging library. 请以root身份或sudo执行。 1. 安装必需的依赖项: sudo apt-get update sudo apt-get install git g cmake 2. 克隆 spdlog 仓库: cd /opt git clone https://github.com/gabime/spdlog.git …

Resilience4j之RateLimiter和常见限流算法总结

官网地址:https://resilience4j.readme.io/docs/ratelimiter 中文文档:https://resilience4j.readme.io/docs/ratelimiter 【1】概述 Resilience4j提供了一个限流器,它将从epoch开始的所有纳秒划分为多个周期。每个周期的持续时间RateLimi…

【opencv - C++ - Ubuntu】putText 显示中文最快方法

话不多说&#xff0c;直接上代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/freetype.hpp>using namespace std; using namespace cv;int main(void) {Mat image(1000, 1800, CV_8UC3, Scalar(200,162,33));Ptr<freetype::F…

银行卡二、三、四要素验证是什么?有什么意义?

银行卡的二、三、四要素验证是银行及金融机构为了确保交易的真实性和安全性&#xff0c;对用户身份进行验证的一系列手段。以下是对这些要素的清晰归纳&#xff1a; 一、银行卡二要素验证 银行卡二要素验证通常包含以下两种组合方式&#xff1a; 姓名卡号&#xff1a;验证用户…

单细胞水平看生存分析相关基因

技能树学徒作业 针对每个癌症的全部基因批量了做了单基因的cox分析&#xff0c;挑选统计学显著的去对应的癌症去打分&#xff0c;看看是否有单细胞亚群特异性。 这题比较常规&#xff0c;但是可以过一遍基础分析的流程。 选择了GSE38832芯片数据用于分析得到cox/logrank显著…

生物墨水与生物打印:一场生物科技的革新?

挤出生物打印 挤出生物打印原理 挤出生物打印利用机械力将生物墨水或生物材料溶液挤出&#xff0c;形成连续的丝状结构&#xff0c;并逐层堆叠构建出三维结构。根据所使用的机械力&#xff0c;挤出生物打印可分为三种类型&#xff1a; 气动式: 利用压缩空气驱动生物墨水或生…

Amazon Bedrock 实践 | 动手玩转 Claude 3

生成式 AI 和大模型在 2024 年已经进入落地实践阶段。因此&#xff0c;围绕开发者在生成式应用程序开发中的主要痛点和需求&#xff0c;我们组织了这个 “Amazon Bedrock 实践” 的系列&#xff0c;希望可以帮助开发者高效地上手生成式 AI 和大模型的应用开发&#xff0c;本篇为…

android super.img解包

一、lpunpack工具编译 mmm system/extras/partition_tools/二、稀疏镜像到非稀疏镜像转换 simg2img super.img super_unsparse.img三、super.img解包 lpunpack super_unsparse.img output 四、拆包结果 ls -l -rw-r--r-- 1 rdx rdx-user size Jan 1 14:36 product_a.img -r…

SMS群发信息API接口安全性有哪些保障方法?

SMS群发信息API接口支持哪些格式&#xff1f;如何使用API接口&#xff1f; SMS群发信息API接口被广泛应用于企业营销、客户服务、身份验证等多个领域。确保SMS群发信息API接口的安全性&#xff0c;已成为企业和开发者们必须重视的问题。AoKSend将探讨几种保障SMS群发信息API接…

GeoServer改造Springboot源码十(样式管理设计)

GeoServer改造Springboot源码一&#xff08;公共部分&#xff09; GeoServer改造Springboot源码二&#xff08;数据源管理设计&#xff09; GeoServer改造Springboot源码三&#xff08;数据源管理代码&#xff09; GeoServer改造Springboot源码四&#xff08;图层管理设计&a…

SQLServer中的函数

一.函数 函数调用格式&#xff1a; select 表名.该表中创建的函数 1.系统函数 系统中自带的函数&#xff0c;比如聚合函数&#xff08;sum等等&#xff09; 2.自定义函数 &#xff08;1&#xff09;.标量值函数&#xff08;只返回单个值&#xff09; 举例&#xff1a;我们…

CNN的小体验

用的pytorch。 训练代码cnn.py&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import torch.nn.functional as F# 定义超参数 num_epochs 10 batch_size 100 learning_rat…

使用Python绘制彩虹效果:动态彩虹动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制彩虹函数定义颜色列表主循环 完整代码 引言 彩虹是自然界中最美丽的现象之一。通过编程&#xff0c;我们可以将这一奇妙的景象带到屏幕上。在这篇博客中&#xff0c;我们将使用Python来创建一个…

聊聊 golang 的 map

1、哈希表 哈希表是一个很常见的数据结构&#xff0c;用来存储无序的 key/value 对&#xff0c;给定的 key 可以在 O(1) 时间复杂度内查找、更新或删除对应的 value。 设计一个好的哈希表&#xff0c;需要着重关注两个关键点&#xff1a;哈希函数、冲突处理。 1.1 哈希函数 …

Redis 高级数据结构业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 hyperloglog 、GEO、bitmap、布隆过滤器的介绍和业务实践 1、HyperLogLog 1.1、功能 基数统计&#xff08;去重&#xff09; 1.2、redis api 命令作用案例PFADD key element [element ...]添加元素到keyPF…

【Linux】systemctl系统和服务管理命令

systemctl 是 systemd 系统和服务管理器的主命令行工具,用于启动、停止、重启、启用、禁用和检查服务状态,以及管理系统状态。systemd 是现代 Linux 发行版中广泛使用的初始化系统(init system),取代了旧的 SysV 和 Upstart 系统。以下是一些常见的 systemctl 命令和用途的…

力扣 用队列实现栈(Java)

核心思想&#xff1a;因为队列都是一端进入另一端出&#xff08;先进先出&#xff0c;后进后出&#xff09;&#xff0c;因此一个队列肯定是不能实现栈的功能的&#xff0c;这里就创建两个队列来模拟栈的先进后出&#xff0c;后进先出。 比如说如果是push操作我们肯定是要弹出栈…

中英双语介绍美国最早的13个殖民地( Thirteen Original Colonies)

中文版 美国最早的十三个殖民地简介 美国最早的十三个殖民地是英格兰在北美洲建立的殖民地&#xff0c;它们后来成为了美国最初的十三个州。这些殖民地是美国历史的重要组成部分&#xff0c;它们在美国革命期间起到了关键作用。以下是对这十三个殖民地的详细介绍&#xff0c;…