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

news2024/11/18 1:40:28

文章目录

  • 什么是跨域
  • 解决方案
    • @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 {

    @Override
    public 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 {

    @Bean
    public 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.coloradmin.cn/o/2169626.html

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

相关文章

Keepalived+Nginx 高可用集群(双主模式)

1.基础环境配置 [rootlb1 ~]# systemctl stop firewalld # 关闭防火墙 [rootlb1 ~]# sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/sysconfig/selinux # 关闭selinux&#xff0c;重启生效 [rootlb1 ~]# setenforce 0          …

计算机毕业设计 基于Hadoop的智慧校园数据共享平台的设计与实现 Python 数据分析 可视化大屏 附源码 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

深度拆解:如何在Facebook上做跨境电商?

国内社交媒体正在逐渐兴盛&#xff0c;海外也不例外。在数字营销的新时代&#xff0c;Facebook已成为跨境电商不可或缺的平台之一。通过Facebook的巨大流量&#xff0c;卖家可以更好的触及潜在消费者&#xff0c;以实现销售增长。本文就深度拆解一下&#xff0c;卖家如何利用Fb…

STM32基础学习笔记-DHT11单总线协议面试基础题7

第七章、DHT11: 单总线协!议 常见问题 1、DHT11是什么 &#xff1f;有什么特性 &#xff1f; 2、单总线协议是什么 &#xff1f;原理 &#xff1f;DHT11的单总线协议的组成 &#xff1f; ## 1、DHT11定义 单总线协议是一种用于在多个设备之间进行通信的协议&#xff0c;所有…

从 Shapley 到 SHAP — 数学理解

如何计算 SHAP 特征贡献的概述 假设你(玩家 1)和朋友(玩家 2)参加了一场 Kaggle 比赛,你最终赢得了 10,000 元的一等奖。现在,你想公平地分配这笔钱。你的朋友建议你平分。但是,你的超参数调整技能更出色。你相信你应该得到更大的份额,因为你为团队做出了更多贡献。考虑…

LeetCode每日一练 —— 88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 思路&#xff1a;用 下标充当指针&#xff0c;…

排序--希尔排序

希尔排序介绍 希尔排序核心思想就是:1,分组;2,直接插入排序:越有序越快 希尔排序就是多次利用直接插入排序的一个排序算法. 希尔排序的算法思想:间隔式分组,利用直接插入排序让组内有序,然后缩小分组再次排序,直到组数为1希尔排序的理论基础就是直接插入排序越有序越快; 希尔排…

《向量数据库指南》——Zilliz迁移服务:一键解锁跨平台数据迁移新纪元

在数据驱动的时代背景下&#xff0c;非结构化数据的处理与迁移已成为企业数字化转型中不可或缺的一环。随着向量数据库技术的飞速发展&#xff0c;尤其是像Milvus这样的高性能向量数据库系统的广泛应用&#xff0c;如何高效、安全、准确地实现数据在不同系统间的迁移&#xff0…

软考高级:系统设计 - MDA 模型 AI 解读

生活化例子 想象一下&#xff0c;你要建造一栋房子。建房子需要三个阶段&#xff1a; CIM (概念阶段)&#xff1a;这是你想象中的房子。你大概知道房子需要几间卧室、厨房、卫生间&#xff0c;但是还没有详细的设计图。就像在脑海中有个大概的想法&#xff1a;我要建个温馨的…

Spring Boot应用:电子商务平台开发

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

2024年9月26日--- Spring-AOP

SpringAOP 在学习编程过程中&#xff0c;我们对于公共方法的处理应该是这样的一个过程&#xff0c;初期阶段如下 f1(){Date now new Date();System.out.println("功能执行之前的各种前置工作"now)//...功能代码//...功能代码System.out.println("功能执行之前…

局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用

前言 在古老的年代&#xff0c;如果我们要实现两台机器进行数据传输&#xff0c; A员工就得去B员工的办公电脑传数据&#xff08;B休息&#xff0c;等A传完&#xff09;&#xff0c;这样就很浪费时间 所以能不能不去B的工位的同时&#xff0c;还能传数据。这时候网络通信就出来…

springboot异常(三):异常处理原理

&#x1f345;一、BasicErrorController ☘️1.1 描述 BasicErrorController是Springboot中默认的异常处理方法&#xff0c;无需额外的操作&#xff0c;当程序发生了异常之后&#xff0c;Springboot自动捕获异常&#xff0c;重新请求到BasicErrorController中&#xff0c;在B…

JS设计模式之桥接模式:搭建跨越维度的通路

引言 在软件开发中&#xff0c;我们经常遇到需要对不同的抽象类进行不同的实现的情况&#xff0c;而传统的对象嵌套并不是一个优雅且可扩展的解决方案&#xff0c;因此这正是桥接模式的用武之地。桥接模式通过将抽象与实现分离&#xff0c;使得它们可以独立变化&#xff0c;从…

前缀和(5)_和为k的子数组

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 前缀和(5)_和为k的子数组 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目…

列表控件QListWidget

显示模式 有两种显示模式&#xff0c;列表模式和图标模式 // 获取和设置显示模式 QListView::ViewMode viewMode() const void setViewMode(QListView::ViewMode mode) QListView::ViewMode有两个取值 QListView::ListMode 列表模式 QListView::IconMode 图标模式 交替背…

《银河战星:僵局》风灵月影修改器使用指南,轻松驾驭宇宙战场

在策略射击游戏《银河战星&#xff1a;僵局》中&#xff0c;合理利用风灵月影修改器能极大提升你的游戏体验。 以下是简明操作步骤&#xff0c;助你迅速上手&#xff0c;遨游星际&#xff1a; 1.下载安装&#xff1a; 首先&#xff0c;确保从正规渠道获取风灵月影修改器&…

冒泡排序-C语言

1.问题&#xff1a; 从小到大对10个数进行排序&#xff0c;要求使用冒泡排序实现。 2.解答&#xff1a; 排序规律有两种&#xff1a;一种是“升序”&#xff0c;从小到大&#xff1b;另一种是“降序”&#xff0c;从大到小。 3.代码&#xff1a; #include<stdio.h>//头…

保护您的网络:入侵检测系统 IDS 终极指南

IDS 和 IPS&#xff1a;了解异同-CSDN博客 IDS(入​​侵检测系统) 和 IPS(入​​侵防御系统) 之间的区别-CSDN博客 即便是今天&#xff0c;互联网仍与黑客肆意横行的网络无异。 但不必害怕&#xff01;我们有解决您问题的完美解决方案&#xff1a;入侵检测系统 I DS。 IDS就…

本地打开打包后的dist文件报错的解决方法

出现问题 本地直接打开dist文件夹会报错&#xff0c;报错信息类似于&#xff1a; Access to script at file:///D:/assets/index.9cb0ffcc.js from origin null has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome, ch…