springboot中有哪些方式可以解决跨域问题

文章目录

  • 什么是跨域
  • 解决方案
    • @CrossOrigin注解
    • 实现WebMvcConfigurer接口
    • CorsFilter过滤器
    • 如何选择?

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

Talk is cheap , 先看代码。

在Springboot项目中新建一个测试接口,端口号默认8080

@RestController
@RequestMapping("test")
public class TestController {@GetMapping("1")public String test1(){System.out.println("1");return "111111111";}
}

再新建一个HTML页面,在页面内访问上述接口:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script>function cors() {$.get('http://localhost:9090/test/1', function(data) {alert(data)});}</script>
</head>
<body>
<button onclick="cors()">CORS</button>
</body>
</html>

Idea中打开,并在浏览器访问, 点击CORS按钮,你猜会发生什么?


是的,你猜对了,浏览器控制台会出现如下提示,就是告诉你跨域了。

cors.html:1 Access to XMLHttpRequest at 'http://localhost:9090/test/1' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

什么是跨域

介绍跨域之前要介绍一下同源策略,什么是同源策略呢?

同源策略是浏览器的一种安全策略,用于限制一个网页文档或脚本如何与其他源的资源进行交互。同源策略的核心思想是:网页文档或脚本只能与加载它们的同一个源下的资源进行交互,而不能与不同源的资源直接进行数据交换。

同源策略有如下3点要求:

  1. 协议相同:两个页面的协议必须相同(如都是 https)。
  2. 域名相同:两个页面的域名(包括子域名)必须相同。
  3. 端口相同:如果指定了端口号,两个页面的端口号必须相同。

举个例子:

  • 如果页面 A 加载自 https://www.example.com,那么它只能与 https://www.example.com 下的资源进行交互,比如可以通过 JavaScript 发送 AJAX 请求。
  • 页面 A 不能直接与 https://api.example.nethttp://sub.example.com 这些不同源的资源进行交互,因为它们的协议、域名或端口不同。

为什么要有同源策略?

如果没有同源策略,网站A就可以访问网站B的Cookie,Cookie中可能会存在用户的token或者其他敏感信息,通过这些敏感信息可能会发送一些伪请求到网站B,从而窃取一些数据。这就相当于你们家什么安全措施都不做,别人想进就进,那可不丢家吗。

跨域或者叫跨域资源共享(Cross-origin resource sharing, CORS) :当浏览器访问不同源的网站时,就会产生跨域问题。

为了让不同源之间的能够访问,就要解决跨域问题。

解决方案

在Springboot中通常有3种方式:

  1. 使用**@CrossOrigin注解**
  2. 实现WebMvcConfigurer接口
  3. 使用CorsFilter过滤器

@CrossOrigin注解

@CrossOrigin注解可以作用于类或者方法级别,当作用于类级别时,表示该类中所有方法都可以实现跨域访问。当应用于方法级别时,表示该方法可以实现跨域访问。

举个例子:

@RestController
@RequestMapping("test")
public class TestController {@CrossOrigin(origins = "http://localhost:63342") // 仅允许来自localhost:63342的请求跨域@GetMapping("1")public String test1(){System.out.println("1");return "111111111";}
}

@CrossOrigin注解有如下属性:

  • origins:允许访问的源列表。可以指定一个或多个 URL,或者使用 * 来允许所有源。注意,如果 allowCredentials 设置为 true,则不能使用 *,必须明确指定源。

  • methods:允许的方法列表,如 GETPOSTPUT 等。同样,也可以使用 * 来允许所有方法。

  • allowedHeaders:请求中允许的头列表。使用 * 可以允许所有头。

  • exposedHeaders:响应中暴露给客户端的头列表。这些头会被添加到 Access-Control-Expose-Headers 响应头中。

  • allowCredentials:是否允许发送 cookies。如果设置为 true,浏览器将允许前端 JavaScript 访问响应中设置的 Cookies 和 HTTP 认证信息。这个选项和配置的域建立了很高的信任度,不过呢,也因为暴露了像 CookiesCSRF 令牌这类敏感的用户特定信息,增加了应用程序被攻击的可能性。 当 allowCredentialstrue 时,origins 不能设置为 *

  • maxAge:预检请求的结果可以被缓存多久(以秒为单位)。这可以减少不必要的预检请求,提高性能。

  • originPatternsSpring 5.3 版本开始新增的属性。允许使用通配符模式来定义允许访问的域名。比如,originPatterns={https://*.domain1.com},就是可以匹配以 domain1.com 结尾的网站。

  • allowPrivateNetworkSpring 5.3.32 版本开始新增的属性。是否允许来自私有网络地址的请求通过跨域请求。

实现WebMvcConfigurer接口

WebMvcConfigurer接口是Spring MVC的一个配置接口,通过它可以自定义配置Spring MVC的行为,包括但不限于视图解析器静态资源处理消息转换器拦截器跨域等。

只要实现WebMvcConfigurer接口重写addCorsMappings方法即可。

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 对所有路径生效.allowedOriginPatterns("*") // 允许源地址的通配符
//                .allowedOrigins("http://localhost:63342") // 允许源地址http://localhost:63342.allowCredentials(true) // 是否允许发送Cookie.allowedMethods("GET", "POST", "DELETE", "PUT") // 允许的请求方法.allowedHeaders("*"); // 允许的请求头}
}

CorsRegistry 是一个用于配置跨域的工具类。

CorsRegistry 类中的属性和@CrossOrigin注解中的跨域属性基本相同,作用也是一样的,这里不做过多介绍。

CorsFilter过滤器

CorsFilter 过滤器,见名知意就是一个用于处理跨域请求的过滤器。具体用法如下:

@Configuration
public class CorsFilterConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedOrigin("http://localhost:63342");config.setAllowCredentials(true);config.addAllowedMethod("*");config.addAllowedHeader("*");
//        config.addAllowedOriginPattern("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();// 匹配路径source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}

看它的用法是不是特别熟悉,是的,没错,它也和@CrossOrigin注解中的跨域属性基本相同。

如何选择?

既然@CrossOrigin注解、WebMvcConfigurer配置类、CorsFilter过滤器都能解决跨域问题,那使用哪个好呢?

先来看一下它们之间的区别:

  • WebMvcConfigurer:用于全局配置CORS策略,适合需要全局配置的场景。
  • CorsFilter:可以精细配置CORS策略,并适用于对不同路径设置不同的CORS策略。
  • @CrossOrigin:用于局部配置,非常适合单个Controller或方法需要不同的CORS策略的情况。

在实际项目中,可以根据需求选择合适的方式来解决跨域问题。如果项目中的跨域需求较为统一,且希望有一个全局性的解决方案,那么WebMvcConfigurer可能是一个不错的选择。如果需要对跨域请求进行更细粒度的控制,或者项目中的跨域需求较为分散,那么CorsFilter或@CrossOrigin可能更适合。

所以,没有好不好,只有合不合适,合适你的就是最好的。

以上在Springboot中解决跨域的三种方式其实都是对CorsConfiguration跨域配置类的封装,感兴趣的可以看一看CorsConfiguration跨域配置类。

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

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

相关文章

算法专题二: 滑动窗口

目录 1. 长度最小的子数组2. 无重复字符的最长子串3. 最大连续1的格数Ⅲ4. 将x减到0的最小操作数5. 水果成篮6. 找到字符串中所有字母异位词7. 串联所有单词的子串8. 最小覆盖子串 1. 长度最小的子数组 题目思路: 首先暴力解法就是依次枚举出所有的子数组, 从第一个元素为左端…

婚恋交友小程序的设计思路与用户体验优化

在数字化时代&#xff0c;婚恋小程序作为一种新兴的婚恋交友平台&#xff0c;正逐渐成为单身人士寻找伴侣的重要工具。一个优秀的婚恋小程序不仅要有创新的设计思路&#xff0c;还要注重用户体验的优化。编辑h17711347205以下是婚恋小程序的设计思路与用户体验优化的详细阐述&a…

ELK--收集日志demo

ELK--收集日志demo 安装ELK日志收集配置启动容器springboot配置测试 之前项目多实例部署的时候&#xff0c;由于请求被负载到任意节点&#xff0c;所以查看日志是开多个终端窗口。后来做了简单处理&#xff0c;将同一项目的多实例日志存入同一个文件&#xff0c;由于存在文件锁…

景联文科技精准数据标注:优化智能标注平台,打造智能未来

景联文科技是一家致力于为人工智能提供全面数据标注解决方案的专业公司。 拥有一支由经验丰富的数据标注师和垂直领域专家组成的团队&#xff0c;确保数据标注的质量和专业性。 自建平台功能一站式服务平台&#xff0c;提供从数据上传、标注、审核到导出的一站式服务&#xff0…

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 timer驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "timer.h"int main(void) {H…

【LeetCode HOT 100】详细题解之链表篇

LeetCode HOT 100题解之链表篇 160 相交链表题目分析代码 206 反转链表方法一&#xff1a;迭代 234 回文链表方法一&#xff1a;将值复制到数组中方法二&#xff1a;快慢指针 141 环形链表方法一&#xff1a;哈希表方法二&#xff1a;快慢指针 142 环形链表II方法一&#xff1a…

<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现

10生成器与python实现 如果是曲线规律的数据集&#xff0c;则需要把模型变复杂。如果是噪音较大&#xff0c;则需要做特征工程。 随机种子的知识点补充&#xff1a; 根据不同库中的随机过程&#xff0c;需要用对应的随机种子&#xff1a; 比如 llist(range(5)) random.shuf…

鸿蒙NEXT开发环境搭建(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南

使用 SSH 连接 Docker 服务器&#xff1a;IntelliJ IDEA 高效配置与操作指南 本文详细介绍了如何在 2375 端口未开放的情况下&#xff0c;通过 SSH 连接 Docker 服务器并在 Idea 中进行开发。通过修改用户权限、生成密钥对以及配置 SSH 访问&#xff0c;用户可以安全地远程操作…

python画图|自制渐变柱状图

在前述学习过程中&#xff0c;我们已经通过官网学习了如何绘制渐变的柱状图及其背景。 掌握一门技能的最佳检验方式就是通过实战&#xff0c;因此&#xff0c;本文尝试做一些渐变设计。 前述学习记录可查看链接&#xff1a; Python画图|渐变背景-CSDN博客 【1】柱状图渐变 …

Mac制作Linux操作系统启动盘

前期准备 一个 Mac 电脑 一个 U 盘&#xff08;8GB 以上&#xff09; 下载好 Linux 系统镜像&#xff08;iso 文件&#xff09; 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘&#xff0c;打开终端输入下面的命令查看 U 盘是否已经 m…

Springboot3 + MyBatis-Plus + MySql + Vue + ProTable + TS 实现后台管理商品分类(最新教程附源码)

Springboot3 MyBatis-Plus MySql Uniapp 商品加入购物车功能实现&#xff08;针对上一篇sku&#xff09; 1、效果展示2、数据库设计3、后端源码3.1 application.yml 方便 AliOssUtil.java 读取3.2 model 层3.2.1 BaseEntity3.2.1 GoodsType3.2.3 GoodsTypeSonVo3.3 Controll…

24 Vue3之集成TailwindCSS

Tailwind CSS Tailwind CSS是一个由js编写的CSS 框架 他是基于postCss 去解析的 官网地址Tailwind CSS 中文文档 - Tailwind CSS - 只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。 | TailwindCSS中文文档 | TailwindCSS中文网 对于PostCSS…

使用root账号ssh登录虚拟机ubuntu

在C:\Users\Administrator\.ssh目录下的config中&#xff0c;添加ubuntu会在根目录中&#xff0c;建立一个root文件夹。在该文件夹中建一个.ssh目录。像免密登录ubuntu设置中&#xff0c;把公钥考进去。在vscode中打开文件夹中选择要打开的文件夹&#xff0c;就可以不需要在ubu…

CentOS7 离线部署docker和docker-compose环境

一、Docker 离线安装 1. 下载docker tar.gz包 下载地址&#xff1a; Index of linux/static/stable/x86_64/ 本文选择版本&#xff1a;23.0.6 2.创建docker.service文件 vi docker.service文件内容如下&#xff1a; [Unit] DescriptionDocker Application Container Engi…

【成神之路】Ambari实战-014-代码生命周期-metainfo-cardinality详解

1.Redis 集群 metainfo.xml 示例 <?xml version"1.0"?> <metainfo><schemaVersion>2.0</schemaVersion><services><service><!-- Redis 集群服务的基本信息 --><name>REDIS</name><displayName>Redi…

Redis的基础认识与在ubuntu上的安装教程

来自Redis的自我介绍 我是Redis&#xff0c;一个中间件&#xff0c;职责是把数据存储在内存上&#xff0c;因此可以作为数据库、缓存、消息队列等场景使用。由于可以把数据存储在内存上&#xff0c;因此江湖人称快枪手 1.redis的功能特性 &#xff08;1&#xff09;数据在内存…

制造企业各部门如何参与生产成本控制与管理?

​国内制造业的分量可不轻&#xff0c;从日常生活用品到高端工业设备&#xff0c;中国制造几乎涵盖了各个领域。 不过很多制造业企业在管理方面确实存在一些难题&#xff1a;成本控制不容易&#xff0c;产品质量并不稳定&#xff0c;生产周期也常常较长。 一、中国制造业生产管…

【ZYNQ 开发】填坑!双核数据采集系统LWIP TCP发送,运行一段时间不再发送且无法ping通的问题解决

问题描述 之所以说是填坑&#xff0c;是因为之前写了一篇关于这个双核数据采集系统的调试记录&#xff0c;问题的具体表现是系统会在运行一段时间后&#xff08;随机不定时&#xff0c;长了可能将近两小时&#xff0c;短则几分钟&#xff09;&#xff0c;突然间就不向电脑发送数…

《家庭无线网络覆盖项目》

家庭无线网络覆盖报项目 目录 家庭无线网络覆盖项目 家庭无线网络覆盖项目 一、项目概述 二、设备清单及报价 三、安装调试费用 四、总报价 五、服务承诺 家庭无线网络覆盖项目 客户姓名:[客户姓名] 联系方式:[电话号码] 家庭地址:[详细地址] 一、项目概述 为客户…