[Java实战]Spring Boot 解决跨域问题(十四)

news2025/5/17 0:37:03

[Java实战]Spring Boot 解决跨域问题(十四)

一、CORS 问题背景
  1. 什么是跨域问题?
    当浏览器通过 JavaScript 发起跨域请求(不同协议、域名、端口)时,会触发同源策略限制,导致请求被拦截。
    示例场景:前端运行在 http://localhost:3000,后端 API 部署在 http://localhost:8080

  2. CORS 机制的作用

    • CORS(Cross-Origin Resource Sharing)是一种基于 HTTP 头的安全机制。
    • 允许服务端声明哪些外部域可以访问资源,解决合法跨域请求的限制。
二、Spring Boot 的 4 种解决方案
1. 使用 @CrossOrigin 注解(Controller 级别)

适用场景:仅需为单个接口或控制器开启跨域支持。
实现方式

@RestController
@RequestMapping("/api")
public class UserController {

    @CrossOrigin(origins = "http://localhost:3000")
    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.findAll();
    }
}

配置参数

  • origins:允许的源(支持通配符 *,但不推荐生产环境使用)
  • methods:允许的 HTTP 方法(如 GET, POST
  • allowedHeaders:允许的请求头(如 Content-Type, Authorization
  • maxAge:预检请求缓存时间(单位:秒)
2. 全局 CORS 配置(推荐)

适用场景:为整个应用统一配置跨域规则。
实现方式

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

关键配置说明

  • addMapping("/**"):对所有接口生效
  • allowCredentials(true):允许携带 Cookie(需与 allowedOrigins 明确指定域名配合)
3. 结合 Spring Security 的 CORS 配置

适用场景:应用启用了 Spring Security 鉴权,需确保 CORS 配置不被安全过滤器拦截。
实现方式

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .cors(cors -> cors.configurationSource(corsConfigurationSource()))
            .csrf().disable()
            .authorizeRequests(auth -> auth.anyRequest().authenticated());
        return http.build();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        config.setAllowedMethods(Arrays.asList("GET", "POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

注意事项

  • 必须通过 cors.configurationSource() 显式配置,而非仅依赖 WebMvcConfigurer
  • 确保 Spring Security 的过滤器链顺序正确(CORS 处理需在认证之前)。
4. 网关层统一处理(Nginx/Spring Cloud Gateway)

适用场景:微服务架构中,在网关层统一管理跨域策略。
示例(Nginx 配置)

server {
    listen 80;
    server_name api.example.com;

    location / {
        # CORS 配置
        add_header 'Access-Control-Allow-Origin' 'http://localhost:3000';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type,Authorization';
        add_header 'Access-Control-Allow-Credentials' 'true';

        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;
            return 204;
        }

        proxy_pass http://backend-service;
    }
}
三、最佳实践与调试技巧
  1. 避免使用通配符 *

    • 生产环境中明确指定 allowedOrigins,如 https://your-frontend-domain.com
    • 通配符会导致 allowCredentials(true) 失效,且存在安全风险。
  2. 处理预检请求(OPTIONS)

    • 浏览器对复杂请求(如带自定义头的 POST)会先发送 OPTIONS 请求。
    • 确保后端正确处理 OPTIONS 方法(可通过全局配置或网关层实现)。
  3. 调试工具推荐

    • 浏览器开发者工具:查看 Console 和 Network 标签中的 CORS 错误信息。
    • Postman:验证接口是否正常工作(绕过浏览器限制)。
    • curl 命令:模拟跨域请求:
      curl -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: GET" -X OPTIONS http://localhost:8080/api/users
      
四、常见问题排查
  1. 配置未生效的可能原因

    • 未正确引入 WebMvcConfigurer 或 Spring Security 配置冲突。
    • 全局配置与 @CrossOrigin 注解混用时优先级问题(注解会覆盖全局配置)。
    • 缓存问题:浏览器可能缓存了旧的 CORS 响应头,需强制刷新(Ctrl + F5)。
  2. Spring Security 导致 CORS 失效

    • 检查安全配置中是否遗漏 .cors() 调用。
    • 确保 CorsConfigurationSource Bean 被正确注册。
  3. 携带 Cookie 时的特殊要求

    • 前端请求需设置 withCredentials: true(Axios 示例):
      axios.get('http://localhost:8080/api/data', { withCredentials: true });
      
    • 后端需配置 allowCredentials(true)allowedOrigins 不能为 *
五、进阶:CORS 与 CSRF 的协同配置

若同时启用 CSRF 保护(如表单提交场景):

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .cors().configurationSource(corsConfigurationSource()).and()
            .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            .authorizeRequests().anyRequest().authenticated();
        return http.build();
    }
}

关键点

  • 使用 CookieCsrfTokenRepository 将 CSRF Token 存储在 Cookie 中。
  • 前端需从 Cookie 读取 XSRF-TOKEN 并添加到请求头。
六、总结

通过合理选择注解配置、全局策略或网关层处理,Spring Boot 可以灵活解决各种跨域场景。关键点在于:

  1. 明确需求:区分开发环境与生产环境的配置严格性。
  2. 安全优先:避免过度开放权限,严格限制 allowedOrigins
  3. 全链路验证:结合浏览器工具和后端日志进行调试。

附录:官方文档参考

  • Spring CORS Documentation
  • MDN CORS Guide

希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!

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

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

相关文章

【HarmonyOS 5】鸿蒙星闪NearLink详解

【HarmonyOS 5】鸿蒙星闪NearLink详解 一、前言 鸿蒙星闪NearLink Kit 是 HarmonyOS 提供的短距离通信服务&#xff0c;支持星闪设备间的连接、数据交互。例如&#xff0c;手机可作为中心设备与外围设备&#xff08;如鼠标、手写笔、智能家电、车钥匙等&#xff09;通过星闪进…

WF24 wifi/蓝牙模块串口与手机蓝牙通信

usb-ttl ch340接线 打开串口工具SSCOM&#xff0c;端口号选择ch340接的那个口&#xff0c;波特率改成115200 DX-SMART_2.0.5.apk下载 手机打开DX-SMART软件 点击透传-搜索BLE-连接WF24-BLE 连接成功串口会收到消息 [14:37:10.591]收←◆ BLE_CONNECT_SUCCESS发送命令ATBLUFI…

通义千问席卷日本!开源界“卷王”阿里通义千问成为日本AI发展新基石

据日本经济新闻&#xff08;NIKKEI&#xff09;报道&#xff0c;通义千问已成为日本AI开发的新基础&#xff0c;其影响力正逐步扩大&#xff0c;深刻改变着日本AI产业的格局。 同时&#xff0c;日本经济新闻将通义千问Qwen2.5-Max列为全球AI模型综合评测第六名&#xff0c;不仅…

流程编辑器Bpmn与LogicFlow学习

工作流技术如何与用户交互结合&#xff08;如动态表单、任务分配&#xff09;处理过 XML 与 JSON 的转换自定义过 bpmn.js 的样式&#xff08;如修改节点颜色、形状、图标&#xff09;扩展过上下文菜单&#xff08;Palette&#xff09;或属性面板&#xff08;Properties Panel&…

Figma 新手教程学习笔记

&#x1f4fa; 视频地址&#xff1a;Figma新手教程2025&#xff5c;30分钟高效掌握Figma基础操作与UI设计流程_哔哩哔哩_bilibili &#x1f9ed; 课程结构 Figma 简介&#xff08;00:38&#xff09; 熟悉工作环境&#xff08;01:49&#xff09; 操作界面介绍&#xff08;03:…

配置Spark环境

1.上传spark安装包到某一台机器&#xff08;自己在finaShell上的机器&#xff09;。 2.解压。 把第一步上传的安装包解压到/opt/module下&#xff08;也可以自己决定解压到哪里&#xff09;。对应的命令是&#xff1a;tar -zxvf 安装包 -C /opt/module 3.重命名。进入/opt/mo…

Window下Jmeter多机压测方法

1.概述 Jmeter多机压测的原理&#xff0c;是通过单个jmeter客户端&#xff0c;控制多个远程的jmeter服务器&#xff0c;使他们同步的对服务器进行压力测试。 以此方式收集测试数据的好处在于&#xff1a; 保存测试采样数据到本地机器通过单台机器管理多个jmeter执行引擎测试…

视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解

引言 在数字图像与视频压缩领域&#xff0c;离散余弦变换&#xff08;Discrete Cosine Transform, DCT&#xff09;凭借其卓越的能量集中特性&#xff0c;成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域&#xff0c;分离出DC系数&#xff08;直流分量&…

能源设备数据采集

在全球可持续发展目标与环境保护理念日益深入人心的时代背景下&#xff0c;有效管理和优化能源使用已成为企业实现绿色转型、提升竞争力的关键路径。能源设备数据采集系统&#xff0c;作为能源管理的核心技术支撑&#xff0c;通过对各类能源生产设备运行数据的全面收集、深度分…

Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)

1.protobuf简介 protobuf 即 Protocol Buffers&#xff0c;是一种轻便高效的结构化数据存储格式&#xff0c;与语言、平台无关&#xff0c;可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储的&#xff0c;占用空…

[Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化

文章目录 [Linux性能优化] 线程卡顿优化。0、省流版本一、问题定位&#xff1a;CPU 资源分析二、线程卡顿现场复现线程优化前图片 三、线程卡顿优化方向1.如果是轮询方式2.如果是事件驱动方式 四、修改方式线程优化后图片 [Linux性能优化] 线程卡顿优化。 0、省流版本 如果采…

Ubuntu20.04下如何源码编译Carla,使用UE4源码开跑,踩坑集合

一、简介 作为一个从事算法研究的人员,无人驾驶仿真一直是比较重要的一部分,但是现在比较常见的算法验证都是在carla这个开源仿真平台上做的,所以我有二次开发carla的需求,今天就来讲讲编译CARLA。 网上的教材很多,但还是推荐大家看官网教程:Linux build - CARLA Simul…

26考研——中央处理器_数据通路的功能和基本结构(5)

408答疑 文章目录 三、数据通路的功能和基本结构数据通路的功能数据通路的组成组合逻辑元件&#xff08;操作元件&#xff09;时序逻辑元件&#xff08;状态元件&#xff09; 数据通路的基本结构CPU 内部单总线方式CPU 内部多总线方式专用数据通路方式 数据通路的操作举例通用寄…

区块链大纲笔记

中心化出现的原因是由于网络的形成&#xff08;不然就孤立了&#xff0c;这显然不符合现实&#xff0c;如&#xff0c;社会&#xff0c;计算机网路&#xff09;&#xff0c;接着由于网络中结点能力一般不对等同时为了便于管理等一系列问题&#xff0c;导致中心化网络的出现。&a…

浏览器自动化:RPA 解决方案的崛起

1. 引言 在 2025 年&#xff0c;浏览器自动化已成为企业和开发者不可或缺的工具。从网页数据抓取到自动化测试&#xff0c;这项技术不仅提高了效率&#xff0c;还推动了 Web 生态的发展。然而&#xff0c;随着浏览器指纹识别和反机器人检测的进步&#xff0c;传统的本地自动化…

手机换地方ip地址会变化吗?深入解析

在移动互联网时代&#xff0c;我们经常带着手机穿梭于不同地点&#xff0c;无论是出差旅行还是日常通勤。许多用户都好奇&#xff1a;当手机更换使用地点时&#xff0c;IP地址会随之改变吗&#xff1f;本文将深入解析手机IP地址的变化机制&#xff0c;帮助您全面了解这一常见但…

AI工具分享篇 | recraft.ai + figma 复刻技术路线图

recraft 介绍 recraft.ai 主要生成和编辑适合网站、印刷和营销的各种风格的矢量艺术、图标、3d图像和插图。其矢量化功能可将路线图转化为一个矢量图。 recraft 的注册流程非常的简单&#xff0c;邮箱注册即可&#xff0c;无需科学上网&#xff0c;3分钟就能搞定。看不懂英文…

部署安装jenkins.war(2.508)

实验目的&#xff1a;部署jenkins&#xff0c;并与gitlab关联bulid 所需软件&#xff1a;jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机&#xff1a;8.10具有java环境,内存最少为4G&#xff0c;cpu双核 目录 jdk安装 …

JS手写代码篇---手写 Object.create

JS手写代码篇 在做手写题的时候&#xff0c;我们要思考两个问题 这个代码的作用是什么能够实现的效果是什么样子 1. 手写 Object.create 思路&#xff1a;创造一个对象&#xff0c;类似于Object.create()方法>将obj作为原型 // 手写 Object.create function create (ob…

spring boot Controller 和 RestController 的区别

spring boot Controller 和 RestController 的区别 5.3.1常用注解 Spring MVC控制器中常使用的注解有如下几种。 Controller Controller 标记在类上。使用Controller 标记的类表示是Spring MVC的Controller对象。分发处理器将会扫描使用了该注解的类&#xff0c;并检测其中的…