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

解决跨域问题(SpringBoot)

“什么是跨域?”

跨域 (Cross-Origin) 是指在浏览器的同源策略(Same-Origin Policy)下,一个网页的源(指协议、域名、端口号的组合)与另一个网页的源不同。因此,不同源的网页之间受到限制,无法直接进行通信。
同源策略(Same-Origin Policy)是一种由浏览器实施的安全机制,旨在限制一个源(指协议、域名、端口号的组合)的网页在脚本中如何与另一个不同源的资源进行交互。该策略的主要目的是防止潜在的恶意网站通过脚本访问用户的敏感信息,增强浏览器的安全性。
具体而言,同源策略限制了通过脚本访问不同源的文档、Cookie、LocalStorage 等资源。当一个网页尝试在脚本中请求另一个不同域的资源时,浏览器会阻止这个请求,以保护用户的隐私和防范潜在的安全威胁。

如何解决:

1.Spring Boot中解决跨域问题有三种主要办法
(1)注解,使用@CrossOrigin注解: 在控制器类或方法上使用@CrossOrigin注解,指定允许的域名、请求方法等。这是一种简单直接的方式/*** 在控制器方法或类上使用 @CrossOrigin 注解,指定允许跨域的配置。* * @param origins 允许访问的域名,可以使用通配符 "*" 表示允许所有域名访问。* @param maxAge 预检请求的缓存时间,单位为秒。在此时间范围内,浏览器无需再次发起预检请求。*/
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
public class MyController {// 控制器方法
}origins: 指定允许访问的域名。可以是一个具体的域名,也可以使用通配符 "*" 表示允许所有域名访问。在示例中,只允许来自 http://localhost:8080 的域名发起跨域请求。
maxAge: 预检请求的缓存时间,单位为秒。预检请求是一种 CORS 机制中的预检查步骤,用于确认实际请求是否安全。maxAge 指定了浏览器可以缓存预检请求的时间,即在这个时间范围内,浏览器无需再次发起预检请求。在示例中,设置为 3600 秒(1 小时)。(2)配置全局跨域规则: 创建一个配置类,继承WebMvcConfigurerAdapter,重写addCorsMappings方法,配置全局的跨域设置public class CorsConfig extends WebMvcConfigurerAdapter {/*** 重写 addCorsMappings 方法,配置全局的跨域设置。* @param registry CorsRegistry 对象,用于配置跨域规则。*/@Overridepublic void addCorsMappings(CorsRegistry registry) {// 针对路径 "/api/**" 配置跨域规则registry.addMapping("/api/**")// 允许访问的域名,可以使用通配符 "*" 表示允许所有域名访问.allowedOrigins("http://localhost:8080")// 允许的请求方法,如 GET、POST、PUT、DELETE.allowedMethods("GET", "POST", "PUT", "DELETE")// 是否允许携带凭证信息(如 Cookie).allowCredentials(true)// 预检请求的缓存时间,单位为秒。在此时间范围内,浏览器无需再次发起预检请求.maxAge(3600);}
}(3)使用Filter进行跨域设置: 创建一个CorsFilter过滤器,配置跨域规则,然后在WebApplication中注册这个过滤器。```c
/*** 自定义 CorsFilter 类,继承自 OncePerRequestFilter,用于配置跨域过滤器。*/
@Component
public class CorsFilter extends OncePerRequestFilter {/*** 重写 doFilterInternal 方法,处理跨域配置逻辑。* @param request HttpServletRequest 对象,表示 HTTP 请求。* @param response HttpServletResponse 对象,表示 HTTP 响应。* @param filterChain FilterChain 对象,表示过滤器链。* @throws ServletException 如果发生 Servlet 异常。* @throws IOException 如果发生 I/O 异常。*/@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {// 设置允许访问的域名为 "http://localhost:8080"response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");// 允许的请求方法,如 GET、POST、PUT、DELETEresponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");// 允许的请求头,如 Content-Typeresponse.setHeader("Access-Control-Allow-Headers", "Content-Type");// 是否允许携带凭证信息(如 Cookie)response.setHeader("Access-Control-Allow-Credentials", "true");// 预检请求的缓存时间,单位为秒。在此时间范围内,浏览器无需再次发起预检请求response.setHeader("Access-Control-Max-Age", "3600");// 继续执行过滤器链filterChain.doFilter(request, response);}
}
  • OncePerRequestFilter: 保证在一次请求中只执行一次过滤的基类。 doFilterInternal:
    重写父类的方法,处理跨域配置逻辑。 response.setHeader(“Access-Control-Allow-Origin”,
    “http://localhost:8080”): 设置允许访问的域名为 “http://localhost:8080”
    response.setHeader(“Access-Control-Allow-Methods”, “GET, POST, PUT,
    DELETE”): 允许的请求方法,如 GET、POST、PUT、DELETE。
    response.setHeader(“Access-Control-Allow-Headers”, “Content-Type”):
    允许的请求头,如 Content-Type。
    response.setHeader(“Access-Control-Allow-Credentials”, “true”):
    是否允许携带凭证信息(如 Cookie)。 response.setHeader(“Access-Control-Max-Age”,
    “3600”): 预检请求的缓存时间,单位为秒。在此时间范围内,浏览器无需再次发起预检请求

2.nginx配置方法
在nginx.conf中稍微添加配置即可:

location / {# 允许跨域的请求,可以自定义变量$http_origin,*表示所有add_header 'Access-Control-Allow-Origin' *;# 允许携带cookie请求add_header 'Access-Control-Allow-Credentials' 'true';# 允许跨域请求的方法:GET,POST,OPTIONS,PUTadd_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';# 允许请求时携带的头部信息,*表示所有add_header 'Access-Control-Allow-Headers' *;# 允许发送按段获取资源的请求add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';# 一定要有!!!否则Post请求无法进行跨域!# 在发送Post跨域请求前,会以Options方式发送预检请求,服务器接受时才会正式请求if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;# 对于Options方式的请求返回204,表示接受跨域请求return 204;}
}

相关文章:

解决跨域问题(SpringBoot)

“什么是跨域?” 跨域 (Cross-Origin) 是指在浏览器的同源策略(Same-Origin Policy)下,一个网页的源(指协议、域名、端口号的组合)与另一个网页的源不同。因此,不同源的…...

LeetCode——2487. 从链表中移除节点

通过万岁!!! 题目:给你一个链表,然后让你从链表中移除一些节点,移除的规则就是我们选择的这个节点在原链表中往右不能有比这个节点大的值。思路:这个题我最开始以为是双指针,然后找…...

云原生和Kubernetes如何简化应用程序开发

在谈论当前技术时,“云计算”正变得非常普遍,作为开发人员,将会继续体验使用云计算应用程序的优势;在云计算中,另一个正在出现的术语是云原生。在进入实际话题之前,首先了解一下云原生到底是什么。 深入了解云原生应用 现在,世界各地的公司都了解云计算应用程序可以带来…...

点云从入门到精通技术详解100篇-基于深度学习的室内场景三维点云语义分割(续)

目录 CSegNet 语义分割模型构建 3.1 引言 3.2 偏移注意机制 3.3 网络主干 3.4 边缘卷积模块...

RabbitMQ消息可靠性保证机制3--消费端ACK机制

消费端ACK机制 ​ 在这之前已经完成了发送端的确认机制。可以保证数据成功的发送到RabbitMQ,以及持久化机制,然尔这依然无法完全保证整个过程的可靠性,因为如果消息被消费过程中业务处理失败了,但是消息却已经被标记为消费了&…...

Copilot在Pycharm的应用和示例

Copilot 是 Github 在 2021 年发布的 AI 代码助手工具,它可以根据你提供的上下文信息,自动生成代码建议,帮助提高代码编写效率和准确性。在 Pycharm 中使用 Copilot,可以进一步提升 Python 开发效率,本文将分享如何在 …...

搜维尔科技:【简报】第九届元宇宙数字人设计大赛,报名已经进入白热化阶段!

随着元宇宙时代的来临,数字人设计成为了创新前沿领域之一。为了提高大学生元宇宙虚拟人角色策划与美术设计的专业核心能力,我们特别举办了这场元宇宙数字人设计赛道,赛道主题为「AI人工智能科技」 ,只要与「AI人工智能科技」相关的…...

性能检测自动化(含内存泄露检测)

一、平台侧实现方案 1、UI case重复执行N次:进入页面,sleep 5s,记录start_time,sleep 30s,记录end_time,性能采集工具全程采集性能数据 2、根据采集到的性能数据,按照N次卡点性能数据:去掉最大的10%、最小的10%,求取平均值,作为单次性能数据结果f(n)…...

iec104和iec61850

iec104和iec61850 IEC104 规约详细解读(一) 协议结构 IEC104 规约详细解读(二)交互流程以及协议解析 61850开发知识总结与分享【1】 Get the necesarry projects next to each other in the same directory; $ git clone https://github.com/robidev/iec61850_open_server.g…...

redis 面试问题 (更新中 ing)

目录 reids 是做什么的为什么那么快有哪些使用场景redis有哪些 数据结构redis 有哪些底层数据结构为什么设计 sds一个 字符串 存储多大容量 stream为什么设计 streamstream 消费者消息丢失stream 消息私信问题 持久化机制redis 持久化机制,优缺点,怎么用…...

力扣(leetcode)第389题找不同(Python)

389.找不同 题目链接:389.找不同 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1: 输入:s “abcd”, t “abcde…...

Linux_源码编译安装LAMP

1. 安装httpd服务 在配置 Apache 网站服务之前,需要正确安装好 httpd 服务器软件。httpd 服务器的安装可以选用 RPM 安装、源码编译安装这两种方式,前者相对比较简单、快速,但是在功能上存在一定的局限性。在实际的生产环境中,使…...

静态网页设计——清雅古筝网(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1T64y1K7Zn/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS(…...

实战Flink Java api消费kafka实时数据落盘HDFS

文章目录 1 需求分析2 实验过程2.1 启动服务程序2.2 启动kafka生产 3 Java API 开发3.1 依赖3.2 代码部分 4 实验验证STEP1STEP2STEP3 5 时间窗口 1 需求分析 在Java api中,使用flink本地模式,消费kafka主题,并直接将数据存入hdfs中。 flin…...

爬虫与反爬-localStorage指纹(某易某盾滑块指纹检测)(Hook案例)

概述:本文将用于了解爬虫中localStorage的检测原理以及讲述一个用于检测localStorage的反爬虫案例,最后对该参数进行Hook断点定位 目录: 一、LocalStorage 二、爬虫中localStorage的案例(以某盾滑块为例) 三、如何…...

聊一聊 webpack 和 vite 的开发服务代理的问题

webpack 和 vite webpackVite重新编辑的问题 changOrigin: true如何定义 /api ? webPack And Vite 都是两个比较好用的打包工具,尤其是 Vite, 几几年流行忘记了,特色就是服务启动极快,实现预加载,感觉 webPack 要比 Vite 要复杂一…...

【鸿蒙4.0】安装DevEcoStudio

1.下载安装包 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者华为鸿蒙DevEco Studio是面向全场景的一站式集成开发环境,,在鸿蒙官网下载或升级操作系统开发工具DevEco Studio最新版本,SDK配置和下载,2.1支持Mac、Windows操作系统。…...

[概率论]四小时不挂猴博士

贝叶斯公式是什么 贝叶斯公式是概率论中的一个重要定理,用于计算在已知一些先验信息的情况下,更新对事件发生概率的估计。贝叶斯公式的表达式如下: P(A|B) P(B|A) * P(A) / P(B) 其中,P(A|B)表示在事件B发生的条件下事件A发生的概…...

算法通关村第二十关-黄金挑战图的常见算法

大家好我是苏麟 , 今天聊聊图的常见算法 . 图里的算法是很多的,这里我们介绍一些常见的图算法。这些算法一般都比较复杂,我们这里介绍这些算法的基本含义,适合面试的时候装*,如果手写,那就不用啦。 图分析算法&#xf…...

服务器内存不足怎么办?会有什么影响?

服务器内存,也被称为RAM(Random Access Memory),是一种临时存储设备,用于临时存放正在运行的程序和数据。它是服务器上的超高速存储介质,可以快速读取和写入数据,提供给CPU进行实时计算和操作。…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...