Springboot如何解决跨域问题?

Springboot如何解决跨域问题?

  • Springboot如何解决跨域问题?
    • 一、先搞懂:为什么会有跨域?
      • 1.1 同源的定义
      • 1.2 跨域的表现
    • 二、方案1:JSONP(基本不用)
      • 2.1 原理
      • 2.2 实战代码
        • 后端接口
        • 前端测试
      • 2.3 适用场景
    • 三、方案2:全局配置(WebMvcConfigurer)
      • 3.1 原理
      • 3.2 实战代码
        • 全局配置类
        • 测试接口
        • 前端测试(Axios)
      • 3.3 适用场景
    • 四、方案3:CorsFilter(官方Filter方案)
      • 4.1 原理
      • 4.2 实战代码
        • 配置类
      • 4.3 适用场景
    • 五、方案4:局部配置(@CrossOrigin注解)
      • 5.1 原理
      • 5.2 实战代码
        • 单个接口配置
        • Controller级配置
      • 5.3 适用场景
    • 六、方案对比与选型建议

Springboot如何解决跨域问题?

在前后端分离架构中,跨域问题是Java开发者绕不开的“基础门槛”。本文从跨域的本质(同源策略)出发,系统讲解SpringBoot中5种主流跨域方案,每个方案包含原理解析+可运行代码+适用场景,帮你彻底解决跨域问题。

一、先搞懂:为什么会有跨域?

跨域的根源是浏览器的同源策略(Same-Origin Policy)——这是浏览器的安全机制,要求请求的“源”必须与当前页面的“源”完全一致,才允许交互。也就是说在两个后端之间互相调用接口是没有跨域问题的。

1.1 同源的定义

“源”由三部分组成,三者完全相同才叫“同源”:

  • 协议(如http/https
  • 域名(如localhost/www.xxx.com
  • 端口(如8080/8090

示例:当前页面是http://localhost:8080,以下请求会被判定为跨域:

  • https://localhost:8080(协议不同)
  • http://127.0.0.1:8080(域名不同)
  • http://localhost:8090(端口不同)

1.2 跨域的表现

浏览器会拦截跨域请求,控制台抛出类似错误:

Access to XMLHttpRequest at 'http://localhost:8081/api' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

二、方案1:JSONP(基本不用)

JSONP是早期跨域方案,前端后端需要同时更改,需要增加一个callback请求参数,当然这个callback参数也可以自定义。

2.1 原理

  1. 前端通过<script>标签请求后端接口,传递回调函数名(如callback=handleData);
  2. 后端将数据包裹在回调函数中返回(如handleData({"msg":"success"}));
  3. 前端提前定义回调函数,接收并处理数据。

2.2 实战代码

后端接口
importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassJsonpController{/** * JSONP接口:接收前端传递的callback参数,返回包裹后的JSON */@GetMapping("/info")publicStringjsonpInfo(@RequestParamStringcallback){// 模拟返回的数据(比如根据id=16查询到的信息)Stringdata="{\"code\":200,\"msg\":\"success\",\"data\":{\"id\":16,\"name\":\"测试数据\",\"desc\":\"JSONP跨域示例\"}}";// 拼接JSONP格式的响应(回调函数名 + 数据)returncallback+"("+data+")";}}
前端测试
<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><title>jQuery Ajax JSONP跨域示例</title><!-- 引入jQuery --><scriptsrc="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script></head><body><buttonid="submitBtn">发起JSONP请求</button><script>$("#submitBtn").click(function(){$.ajax({url:'http://localhost:8080/info?id=16',// 后端接口地址(带参数id=16)type:'GET',// JSONP仅支持GET请求dataType:'jsonp',// 关键:指定数据类型为jsonpjsonp:'callback',// 告诉后端:前端用callback参数传递回调函数名(默认就是callback,可省略)success:function(response){// 成功接收后端返回的数据console.log("JSONP请求成功,返回数据:",response);alert("请求成功!数据ID:"+response.data.id+",名称:"+response.data.name);},error:function(err){console.error("JSONP请求失败:",err);alert("请求失败,请检查控制台");}});});</script></body></html>

2.3 适用场景

仅适用于简单GET请求,或需要兼容老旧浏览器(如IE)的场景,不推荐现代项目使用。

三、方案2:全局配置(WebMvcConfigurer)

这是SpringBoot中最常用、最优雅的跨域方案,通过配置全局CORS规则实现。

3.1 原理

基于W3C的CORS标准,服务端通过响应头告知浏览器“允许哪些源的请求”,核心响应头包括:

  • Access-Control-Allow-Origin:允许的跨域源;
  • Access-Control-Allow-Methods:允许的请求方法;
  • Access-Control-Allow-Credentials:是否允许携带Cookie。

3.2 实战代码

全局配置类
importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@ConfigurationpublicclassGlobalCorsConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping("/**")// 匹配所有接口.allowedOriginPatterns("*")// 允许所有源(生产环境建议指定域名).allowedMethods("GET","POST","PUT","DELETE")// 允许的请求方法.allowedHeaders("*")// 允许所有请求头.allowCredentials(true)// 允许携带Cookie.maxAge(3600);// 预检请求缓存1小时}}
测试接口
@RestControllerpublicclassTestController{@GetMapping("/api/test/get")publicStringtestGet(){return"GET跨域成功";}@PostMapping("/api/test/post")publicStringtestPost(@RequestBodyStringdata){return"POST跨域成功,接收:"+data;}}
前端测试(Axios)
<scriptsrc="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><buttononclick="axios.get('http://localhost:8080/api/test/get').then(res=>alert(res.data))">测试GET</button><buttononclick="axios.post('http://localhost:8080/api/test/post',{name:'张三'}).then(res=>alert(res.data))">测试POST</button>

3.3 适用场景

前后端分离的现代项目,推荐作为默认方案使用。

四、方案3:CorsFilter(官方Filter方案)

通过Spring官方的CorsFilter实现跨域,比手动写Filter更规范、更灵活。

4.1 原理

CorsFilter是Spring封装的CORS过滤器,通过CorsConfiguration配置规则,再绑定到指定路径,自动拦截请求并添加跨域响应头。

4.2 实战代码

配置类
importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlBasedCorsConfigurationSource;importorg.springframework.web.filter.CorsFilter;importjava.util.Collections;@ConfigurationpublicclassCorsFilterConfig{@BeanpublicCorsFiltercorsFilter(){// 1. 配置跨域规则CorsConfigurationconfig=newCorsConfiguration();config.setAllowedOriginPatterns(Collections.singletonList("*"));config.addAllowedHeader(CorsConfiguration.ALL);config.addAllowedMethod(CorsConfiguration.ALL);config.setAllowCredentials(true);config.setMaxAge(3600L);// 2. 绑定路径UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**",config);// 所有路径应用规则// 3. 返回CorsFilterreturnnewCorsFilter(source);}}

4.3 适用场景

需要更灵活的跨域逻辑(如动态调整跨域规则),或项目中已使用Filter链的场景。

五、方案4:局部配置(@CrossOrigin注解)

仅为个别接口/Controller配置跨域,优先级高于全局配置。

5.1 原理

@CrossOrigin是Spring提供的注解,底层基于CORS机制,为标注的接口自动添加跨域响应头。

5.2 实战代码

单个接口配置
@RestControllerpublicclassCrossOriginController{@CrossOrigin(origins="*",maxAge=3600)@GetMapping("/api/cross/test")publicStringcrossTest(){return"单个接口跨域成功";}}
Controller级配置
@CrossOrigin(origins="http://localhost:8080")// 仅允许8080源@RestControllerpublicclassCrossOriginController2{@GetMapping("/api/cross/test2")publicStringcrossTest2(){return"Controller级跨域成功";}}

5.3 适用场景

个别接口需要单独配置跨域的场景,不推荐全局使用。

六、方案对比与选型建议

方案适用场景优点缺点
JSONP简单GET请求、兼容老旧浏览器实现简单仅支持GET、有安全风险
WebMvcConfigurer前后端分离全局跨域优雅简洁、易维护灵活性稍弱
CorsFilter复杂跨域规则、Filter链场景灵活可控、官方规范代码量略多
@CrossOrigin个别接口/Controller跨域局部配置、无需全局修改不适合全局场景

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

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

相关文章

Hadoop数据加密:保护敏感信息的方法

Hadoop数据加密深度解析&#xff1a;从理论到实践的敏感信息保护方案 元数据框架 标题&#xff1a;Hadoop数据加密深度解析&#xff1a;从理论到实践的敏感信息保护方案 关键词&#xff1a;Hadoop加密, 静态数据加密, 密钥管理, 透明加密, 端到端加密, 敏感数据保护, 大数据安全…

计算机深度学习毕设实战-基于人工智能卷积网络的蔬菜识别基于CNN卷积网络的蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

SamOutVXP-2601: 轻量级高效语言模型

&#x1f31f; 模型简介 SamOutVXP-2601 相比SamOutVXP之前的架构&#xff0c;使用了卷积新的架构&#xff0c;从而实现了推理速度的提升&#xff0c;训练速度的提升。 &#x1f4e6; 模型结构参数数值参数量46M &#x1f3af;层数8 &#x1f9f1;隐藏维度512 &#x1f4d0;上下…

[Day8] Contract-AI 的 bugfix 之路,疑难杂症大揭秘:GLM、Feign 及文件传递问题全攻克

后端技术实践&#xff1a;问题与解决方案 目录 GLM接口链接文件获取问题Feign访问400问题排查与解决接口文件传递问题及处理总结与下期预告 GLM接口链接文件获取问题 在项目开发过程中&#xff0c;遇到了GLM接口无法获取链接文件的情况。尽管传递的格式正确&#xff0c;且链…

吐血推荐!MBA论文必备TOP9 AI论文网站深度测评

吐血推荐&#xff01;MBA论文必备TOP9 AI论文网站深度测评 为什么需要一份靠谱的MBA论文AI工具榜单 在MBA学习过程中&#xff0c;撰写高质量的论文是每位学生必须面对的挑战。随着人工智能技术的发展&#xff0c;越来越多的AI论文辅助工具涌现&#xff0c;但如何选择真正适合自…

突破AI原生应用领域可控性的瓶颈

突破AI原生应用领域可控性的瓶颈:从"黑箱魔法"到"透明工坊" 关键词:AI原生应用、可控性、可解释性、意图对齐、动态反馈 摘要:当AI从"辅助工具"进化为"原生构建者",我们不再满足于它"偶尔给出惊喜",而是需要它"稳…

华为OD机试真题双机位C卷 【采购订单】C语言实现

采购订单 2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录&#xff5c;机考题库 算法考点详解 题目描述 在一个采购系统中&#xff0c;采购申请(PR)需要经过审批后才能生成采购订单(P…

渗透测试该如何系统学习?一份从小白到实战的学习路径规划

渗透测试该如何系统学习&#xff1f;一份从小白到实战的学习路径规划 在网络安全持续升温的今天&#xff0c;越来越多的人开始关注“渗透测试”这一硬核技能。但渗透测试门槛不低&#xff0c;很多新手一上来就被术语、工具和庞杂的学习路径劝退。 那么&#xff0c;渗透测试到…

深度学习毕设项目:基于python的蔬菜识别基于CNN卷积网络的蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Agent全面爆发!一文搞懂Agent开发核心链路

过去一年&#xff0c;「智能体&#xff08;Agent&#xff09;」这个词的含义悄悄变了。 最早大家聊的是&#xff1a; 模型够不够聪明&#xff1f; 回答像不像人&#xff1f; 而现在&#xff0c;越来越多团队在问的是&#xff1a; 它能不能自己判断&#xff1f; 能不能自己…

2026必备!8个AI论文平台,助你轻松搞定本科毕业论文!

2026必备&#xff01;8个AI论文平台&#xff0c;助你轻松搞定本科毕业论文&#xff01; AI 工具的崛起&#xff0c;让论文写作不再难 在当前这个信息爆炸的时代&#xff0c;学术研究和论文写作已成为本科生必须面对的重要任务。无论是课程作业还是毕业论文&#xff0c;都对学生…

渗透测试和逆向工程,它们的区别是什么?当一名白帽黑客要学逆向吗?

渗透测试和逆向工程&#xff0c;它们的区别是什么&#xff1f;当一名白帽黑客要学逆向吗&#xff1f; 在网络安全领域&#xff0c;渗透测试与逆向工程常被并称为 “攻防两大核心技术”&#xff0c;但两者的技术路径、应用场景和核心目标存在显著差异。对于白帽黑客而言&#x…

微服务架构下的高可用保障:RuoYi-Cloud中Sentinel与Feign的完美融合

在微服务架构中,服务间的稳定通信是系统可用性的基石。本文将深度解析如何在RuoYi-Cloud框架中通过Sentinel与Feign的深度集成,实现优雅的服务调用与智能的熔断降级。 引言:微服务通信的挑战 随着企业应用规模不断扩大,传统的单体架构已无法满足业务快速迭代的需求。微服务…

智能体迈入 Agent RL 新架构时代?

序章&#xff1a;三大核心认知基石 在探索 Agent RL 技术浪潮之前&#xff0c;我们需先锚定三个根本性认知&#xff1a; 人类的本质&#xff1a;生物界中&#xff0c;人类凭借高等智慧脱颖而出&#xff0c;而制造与使用工具的能力&#xff0c;正是人与动物的核心分野。 大模型…

【课程设计/毕业设计】基于机器学习CNN卷积网络的蔬菜识别基于深度学习的蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

深度学习毕设选题推荐:基于CNN深度学习的遥感图片识别沙漠湖泊和森林基于pythonCNN深度学习的遥感图片识别沙漠湖泊和森林

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

渗透测试技术,从入门到精通,小白也能成为白帽黑客,最新的学习路线和方法都在这。

渗透测试技术&#xff0c;从入门到精通&#xff0c;小白也能成为白帽黑客&#xff0c;最新的学习路线和方法都在这。 安全圈最热的渗透技术怎么学&#xff1f;从入门到精通最完整的学习方法&#xff0c;学完你就是白帽大佬。 首先你要知道渗透测试工程师的主要工作是什么&…

qsort-简单使用 · vs2022调试

把10个整形数据排序&#xff0c;你会怎么做&#xff1f;先来考虑升序情况最先想到用冒泡法做&#xff0c;ok,正好回忆一下oi~那还有更简洁的方法吗&#xff1f;有请 qsort 函数qsort 函数&#xff1a;void qsort(void*base,size-t num,size-t size, int (*compar)(const void*,…

一文彻底厘清:AI Agent、Agentic Workflow与Agentic AI

随着大模型的多次迭代、更多技术架构的提出以及多样化产品的出现&#xff0c;加上学术界对于Agentic AI与AI Agent的全新诠释&#xff0c;可能技术、产品等圈子已经对这几个概念有了更深的认知。但是各领域的相关从业者&#xff0c;对着几个概念仍旧很模糊。 现在AI Agent已经成…

深度学习计算机毕设之基于深度学习卷积网络的蔬菜识别基于CNN卷积网络的蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…