百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

深入剖析 Spring Boot 3 解决跨域问题的实用方案

ztj100 2025-03-13 22:11 41 浏览 0 评论

在当今互联网大厂的软件开发流程中,Spring Boot 3 作为一款广泛应用的开发框架,其解决跨域问题的能力对于保障项目的顺利推进至关重要。随着前后端分离架构的普及,跨域请求已成为开发过程中频繁遭遇的挑战。本文将深入探讨 Spring Boot 3 解决跨域问题的多种实用方案,帮助广大互联网大厂开发人员更好地应对这一难题。

跨域问题的本质与产生原因

跨域问题源于浏览器的同源策略。所谓同源,即两个页面的协议、主机和端口号完全一致。一旦这三者中的任何一个不同,就会触发跨域问题。例如,当前端页面部署在
http://app.example.com:8080,而后端服务运行在
https://api.example.com:8443时,浏览器会阻止前端页面直接向该后端服务发起请求,因为协议、端口号以及可能存在的主机名差异均不符合同源要求。

同源策略的存在是为了保护用户的信息安全,防止恶意网站通过脚本获取其他网站的敏感数据。然而,在实际开发中,尤其是在微服务架构盛行的今天,不同服务往往部署在不同的域名、端口甚至协议下,这就不可避免地导致了跨域请求的需求。

Spring Boot 3 解决跨域问题的常见方法

使用@CrossOrigin注解

@CrossOrigin注解是 Spring 框架提供的一种便捷方式来处理跨域请求。它可以直接应用于 Controller 类或具体的请求处理方法上。

当将@CrossOrigin注解应用于 Controller 类时,该 Controller 下的所有请求处理方法都将支持跨域请求。例如:

@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "*")
public class UserController {
    // 具体业务逻辑方法
}

上述代码中,@CrossOrigin(origins = "*")表示允许来自任何源的跨域请求。在实际应用中,为了安全性考虑,建议将origins属性设置为具体的允许来源,如@CrossOrigin(origins = "http://allowed-origin.com")。

若将@CrossOrigin注解应用于单个请求处理方法,则只有该方法支持跨域请求,示例如下:

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/{id}")
    @CrossOrigin(origins = "http://specific-origin.com")
    public User getUserById(@PathVariable Long id) {
        // 获取用户信息逻辑
    }
}

全局配置 CORS

通过创建一个配置类实现WebMvcConfigurer接口,并覆盖addCorsMappings方法,可以进行全局的 CORS(Cross-Origin Resource Sharing)配置。

以下是一个典型的全局 CORS 配置示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
               .allowedOrigins("*")
               .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
               .allowedHeaders("*")
               .allowCredentials(true)
               .maxAge(3600);
    }
}

在上述配置中:

  • addMapping("/**")表示对所有请求路径都进行跨域配置。
  • allowedOrigins("*")允许所有来源的请求,实际应用中应替换为具体的允许来源。
  • allowedMethods指定了允许的 HTTP 请求方法。
  • allowedHeaders允许所有请求头,同样在实际应用中可根据需求进行限制。
  • allowCredentials(true)表示允许携带凭证(如 Cookie)。
  • maxAge(3600)设置预检请求的有效期为 3600 秒。

使用 Filter 实现 CORS

通过自定义 Filter 也可以实现对跨域请求的处理。首先创建一个实现Filter接口的类,然后在该类中编写跨域处理逻辑。

示例代码如下:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        httpResponse.setHeader("Access-Control-Allow-Headers", "*");
        httpResponse.setHeader("Access-Control-Max-Age", "3600");
        chain.doFilter(request, response);
    }
}

上述代码中,在doFilter方法中设置了跨域相关的响应头。需要注意的是,在实际应用中,同样应将
Access-Control-Allow-Origin设置为具体的允许来源,以提高安全性。

接下来,需要将该 Filter 注册到 Spring 容器中,可通过配置类实现:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterRegistrationConfig {
    @Bean
    public FilterRegistrationBean corsFilterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CorsFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

不同方法的适用场景与优缺点

@CrossOrigin注解

适用场景:适用于对个别 Controller 或方法进行跨域设置,尤其是在项目初期,对跨域需求不太明确,需要逐步调整的情况下。

优点:使用简单,灵活度高,可以针对不同的 Controller 或方法进行细粒度的跨域配置。

缺点:如果项目中有大量的 Controller 和方法需要进行跨域配置,使用该注解会导致代码冗余。同时,由于注解分散在各个 Controller 类中,不利于统一管理和维护。

全局配置 CORS

适用场景:适用于整个项目对跨域请求的规则较为统一的情况,例如前后端分离的项目,前端域名固定,后端所有接口都需要支持从该前端域名发起的跨域请求。

优点:配置集中,易于管理和维护。通过一次配置,即可对整个项目的跨域请求进行统一处理,避免了代码冗余。

缺点:灵活性相对较低,对于某些特殊的 Controller 或方法,如果需要单独设置不同的跨域规则,可能无法满足需求。

使用 Filter 实现 CORS

适用场景:适用于对跨域请求的处理逻辑有特殊需求,需要在 Filter 中进行一些额外处理的情况,例如在处理跨域请求的同时,记录请求日志等。

优点:可以在 Filter 中编写自定义的处理逻辑,满足特定的业务需求。同时,Filter 的注册和配置相对简单。

缺点:如果项目中已经存在大量的 Filter,可能会导致 Filter 链过长,影响性能。此外,由于 Filter 是基于 Servlet 规范的,与 Spring 框架的集成度不如前两种方法高。

总结

跨域问题是互联网大厂开发人员在使用 Spring Boot 3 进行开发时不可避免会遇到的挑战。通过本文介绍的@CrossOrigin注解、全局配置 CORS 以及使用 Filter 实现 CORS 等多种方法,开发人员可以根据项目的实际需求和特点,选择合适的解决方案。同时,在实际应用中,应注意安全性、性能优化和兼容性等问题,以确保项目的稳定运行。希望本文能够为广大开发人员在解决 Spring Boot 3 跨域问题时提供有益的参考和帮助。

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: