SpringBoot 如何处理跨域请求?你说的出几种方法?

news2025/1/11 21:37:24

引言:在现代的Web开发中,跨域请求(Cross-Origin Resource Sharing,CORS)是一个常见的挑战。随着前后端分离架构的流行,前端应用通常运行在一个与后端 API 不同的域名或端口上,这就导致了浏览器的同源策略(Same-Origin Policy)的限制,从而出现了跨域请求问题。

Spring Boot 作为一种流行的 Java 后端框架,提供了多种处理跨域请求的方法,使得开发人员能够灵活地配置和管理跨域资源共享。本文将深入探讨几种常见的解决方案,帮助开发人员理解如何在 Spring Boot 应用中有效地处理跨域请求问题。

题目

SpringBoot 如何处理跨域请求?你说的出几种方法?

推荐解析

跨域请求概述

1)什么是跨域请求?
跨域请求(Cross-Origin Request)指的是在浏览器环境下,前端代码发起的请求与当前页面的域名(或端口、协议)不同。浏览器的同源策略(Same-Origin Policy)限制了从一个源(域名、协议、端口组成的组合)加载的文档或脚本如何与来自另一个源的资源进行交互。

具体来说,如果一个页面加载自 http://domain1.com,则它的同源策略默认限制了对 http://domain2.com 发起的请求。

2)为什么会出现跨域问题?

跨域问题的出现主要是为了保护用户数据和用户隐私安全。如果没有同源策略的限制,恶意网站可以利用当前用户的身份在其他网站上进行操作,如发送请求、读取数据,这可能导致信息泄露或潜在的安全威胁。

3)可能会导致的安全风险

信息泄露:允许恶意网站读取其他网站的敏感数据。

CSRF(跨站请求伪造)攻击:如果没有适当的防护措施,允许攻击者伪造用户的请求并在用户不知情的情况下执行操作。

恶意脚本注入:通过跨域请求注入恶意脚本,影响其他域上的安全性。

跨域解决方案

1)使用@CrossOrigin注解

Spring 框架提供了@CrossOrigin注解,可以直接在 Controller 类或方法上使用,以声明允许来自特定源的请求。例如:

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

    @CrossOrigin(origins = "http://allowed-origin.com")
    @GetMapping("/data")
    public ResponseEntity<String> getData() {
        // 处理逻辑
    }
}

优点:简单直接,适用于简单的跨域场景。

缺点:无法进行更细粒度的配置,如请求方法、请求头等。

2) 使用WebMvcConfigurer配置类

通过自定义WebMvcConfigurer配置类,可以更灵活地配置跨域请求。例如:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://allowed-origin.com")
                .allowedMethods("GET", "POST")
                .allowedHeaders("header1", "header2")
                .exposedHeaders("header3")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

优点:可以精确控制允许的源、方法、头部等。

缺点:需要编写额外的配置类,相对比较复杂。

3)使用过滤器(Filter)

通过自定义过滤器来处理跨域请求,这种方法可以在请求到达 Controller 之前进行处理。例如:

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        
        response.setHeader("Access-Control-Allow-Origin", "http://allowed-origin.com");
        response.setHeader("Access-Control-Allow-Methods", "GET,POST");
        response.setHeader("Access-Control-Allow-Headers", "header1,header2");
        response.setHeader("Access-Control-Expose-Headers", "header3");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Max-Age", "3600");
        
        chain.doFilter(req, res);
    }

}

优点:可以完全自定义跨域请求处理逻辑。

缺点:需要更多的Java编程经验,并且可能需要处理更复杂的跨域场景。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

1. 预检请求(Preflight Requests)

跨域请求中,某些复杂请求(如带有自定义头部的请求、使用某些特殊方法如PUT、DELETE等的请求)会触发浏览器先发送一个预检请求(OPTIONS请求)到服务器,以确定是否允许实际的请求。预检请求包含以下头部信息:

  • Origin:表明发起请求的源。
  • Access-Control-Request-Method:实际请求将使用的HTTP方法。
  • Access-Control-Request-Headers:实际请求将使用的自定义头部。

服务器需要正确响应预检请求,以确保浏览器安全地执行实际请求。

处理预检请求的方法:
  • 使用@CrossOrigin注解处理

    @CrossOrigin(origins = "http://allowed-origin.com", methods = {RequestMethod.GET, RequestMethod.POST}, allowedHeaders = {"header1", "header2"})
    @RequestMapping(value = "/api/data", method = RequestMethod.OPTIONS)
    public ResponseEntity<Void> preflight() {
        return ResponseEntity.ok().build();
    }
    

    在Controller中定义一个处理OPTIONS请求的方法,并使用@CrossOrigin注解指定允许的源、方法和头部。

  • 通过WebMvcConfigurer配置类处理

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**")
                    .allowedOrigins("http://allowed-origin.com")
                    .allowedMethods("GET", "POST")
                    .allowedHeaders("header1", "header2")
                    .exposedHeaders("header3")
                    .allowCredentials(true)
                    .maxAge(3600);
        }
    
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**")
                    .allowedOrigins("http://allowed-origin.com")
                    .allowedMethods("GET", "POST")
                    .allowedHeaders("header1", "header2")
                    .exposedHeaders("header3")
                    .allowCredentials(true)
                    .maxAge(3600);
        }
    }
    

    WebMvcConfigurer配置类中,通过重写addCorsMappings方法来定义预检请求的处理方式。

2. 其他注意事项

  • Credentials(凭证)的处理

    如果请求需要使用凭证(如使用Cookie、HTTP认证信息等),需要确保在跨域请求中设置Access-Control-Allow-Credentialstrue,并在客户端请求中设置withCredentialstrue

  • 暴露自定义头部

    如果需要在响应中暴露某些自定义头部供客户端访问,可以通过Access-Control-Expose-Headers头部指定。

  • 缓存控制

    可以通过Access-Control-Max-Age头部指定预检请求的缓存时间,减少重复发送预检请求的次数,提升性能。

总结

避免跨域请求问题不仅仅是简单地允许跨域请求,还需要正确处理预检请求及相关细节。通过使用@CrossOrigin注解、自定义WebMvcConfigurer配置类或过滤器来处理跨域请求,可以有效地保证跨域请求的安全性和可靠性。同时,要特别注意凭证的处理及其他相关头部信息的配置,确保跨域请求能够在安全、可控的环境下完成。

欢迎交流

本文主要介绍 SpringBoot 处理跨域请求的方式,另外可以用 SpringSecurity 和 SpringCloudGateWay 等框架进行全局跨域处理,在文末还剩下三个问题,欢迎小伙伴在评论区进行留言!近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)如何区分简单请求和复杂请求?

2)在实际项目中,如何选择合适的跨域请求解决方案?

3)如何处理凭证(Credentials)在跨域请求中的应用?

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

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

相关文章

HarmonyOs NEXT 鸿蒙 ArkUI 这篇就够了

目录 1.ArkUI 的基础 2.组件的属性方法 3.文本颜色 4.文字溢出省略号 5.行高 6.图片组件 7.输入框 8.按钮 9.内边距padding 10.外边距margin 11. 边框 border 12.设置组件圆角 13.特殊圆角的设置&#xff08;正圆、胶囊圆&#xff08;左右半圈&#xff09;&#xf…

自养号测评助力:Target与沃尔玛防关联技术全解析

大家好&#xff0c;今天我们来深入剖析在自养号下单流程中&#xff0c;如何运用先进的底层技术原理来有效防止账号关联与风险防控&#xff0c;特别是在构建防封号环境方面的策略与实践。聚焦于平台的伪装工具与策略部署&#xff0c;我们将从以下几个核心维度展开详尽讨论&#…

C语言快速学习笔记

学习网站&#xff1a;C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com) 这个网站知识完整&#xff0c;讲解清晰。 在线C语言编程工具&#xff1a;菜鸟教程在线编辑器 (runoob.com) 国外学习网站&#xff1a;C语言介…

通过桥梁振动信号自动识别车辆(MATLAB)

只是简单参数建模&#xff0c;还没有实际场景应用。 Generation of the bridge response to multiple vehicles Initialisation clearvars;close all;clc clf;close all;Nyy 446; % Number of nodes to discretize the bridge structure. We need a spatial resolution of 1…

漫步5G-A City,一份独属于上海的浪漫

作家亨利詹姆斯曾写道&#xff0c;“城市漫步&#xff0c;让我接触到了这个世界上最好的东西”。 用漫无目的地行走&#xff0c;来体验和观察一座城市&#xff0c;上海凭借丰富多元的文化特质&#xff0c;成为citywalk这种浪漫生活方式的流行地。 无论你是漫步在美术馆、画廊林…

CesiumJS【Basic】- #051 绘制纯色填充多边形(Entity方式)

文章目录 绘制纯色填充多边形(Entity方式)1 目标2 代码2.1 main.ts绘制纯色填充多边形(Entity方式) 1 目标 使用Entity方式绘制绘制纯色填充多边形 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer

昇思25天学习打卡营第十五天|基于MobileNetv2的垃圾分类

基于MobileNetv2的垃圾分类 MobileNetv2模型原理介绍 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#xff0c;相比于传统的卷积神经网络&#xff0c;MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolut…

六西格玛绿带培训ROI:你的投资究竟值不值?

近年来&#xff0c;企业对于员工培训的投入日益增加&#xff0c;六西格玛绿带培训更是作为提升企业运营效率和质量管理的利器&#xff0c;更是备受关注。然而&#xff0c;面对高昂的培训成本&#xff0c;企业如何评估六西格玛绿带培训的投资回报率&#xff08;ROI&#xff09;呢…

被⽹络罪犯利⽤的5⼤ChatGPT越狱提⽰

⾃ChatGPT发布的近18个月以来&#xff0c;⽹络罪犯们已经能够利⽤⽣成式AI进⾏攻击。OpenAI在其内容政策中制定了限制措施&#xff0c;以阻⽌⽣成恶意内容。作为回应&#xff0c;攻击者们创建了⾃⼰的⽣成式AI平台&#xff0c;如 WormGPT和FraudGPT&#xff0c;并且他们还分享了…

难道 Java 已经过时了?

当一门技术已经存在许多年了&#xff0c;它可能会失去竞争力&#xff0c;而后黯然退场&#xff0c;默默地离开&#xff0c;这对大部分的人来说就已经算是过时了。 Java 于 1995 年正式上线&#xff0c;至今已经走过了 27 个年头&#xff0c;在众多编程技术里算是年龄比较大的语…

大数据基础知识【大数据导论】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 大数据基础知识前 必看 【大数据导论】—大数据序言…

安卓模拟器如何修改ip地址

最近很多老铁玩游戏的&#xff0c;想多开模拟器一个窗口一个IP&#xff0c;若模拟器窗口开多了&#xff0c;IP一样会受到限制&#xff0c;那么怎么更换自己电脑手机模拟器IP地址呢&#xff0c;今天就教大家一个修改模拟器IP地址的方法&#xff01;废话不多说&#xff0c;直接上…

【Python】已解决:AttributeError: module ‘sys’ has no attribute ‘setdefaultencoding’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;AttributeError: module ‘sys’ has no attribute ‘setdefaultencoding’ 一、分析问题背景 在Python编程中&#xff0c;有时我们会遇到“AttributeError: mo…

Modbus转ProfibusDP主站网关连接温控表通讯技术

Modbus转ProfibusDP主站网关&#xff08;XD-MDPBM20&#xff09;是实现不同通讯协议设备之间联系的重要组件。在工业自动化领域中&#xff0c;温控表是常见且必要的设备&#xff0c;它可以用于监控和调节温度&#xff0c;保障生产过程的稳定性。本文将详细探讨如何利用Modbus转…

【热门会议|见刊快】2024年管理创新与教育国际会议 (ICMIE 2024)

2024年管理创新与教育国际会议 (ICMIE 2024) 2024 International Conference on Management Innovation and Education 【重要信息】 大会地点&#xff1a;洛阳 大会官网&#xff1a;http://www.icicmie.com 投稿邮箱&#xff1a;icicpsssub-conf.com 【注意&#xff1a;稿将稿…

springboot评选投票系统-计算机毕业设计源码15837

摘 要 本文介绍的是基于Spring Boot开发的评选投票系统小程序。该系统旨在为用户提供一个便捷、高效的平台&#xff0c;以实现评选活动的投票功能。随着社交媒体和互联网的普及&#xff0c;评选活动已成为各行业中常见的形式&#xff0c;如最佳歌曲、最佳演员等。然而&#xf…

干货:js解析url参数的作用、场景、方法和安全策略。

涉及到Web3D开发&#xff0c;Three.js和Babylon.js是两个备受推崇的引擎。它们都是基于WebGL的开源3D引擎&#xff0c;用于创建交互式的3D图形应用程序&#xff0c;但要细论起来&#xff0c;three.js普及度远超Babylon .js. 一、二者的介绍 Three.js&#xff1a; Three.js 是…

PLC_博图系列☞TP:生成脉冲

PLC_博图系列☞TP&#xff1a;生成脉冲 文章目录 PLC_博图系列☞TP&#xff1a;生成脉冲背景介绍TP&#xff1a; 生成脉冲说明参数脉冲时序图示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 TP 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门…

网安小贴士(4)哈希函数

一、前言 哈希函数是密码学中的基础工具&#xff0c;哈希函数在密码学中扮演着至关重要的角色&#xff0c;广泛应用于确保数据的安全性和完整性。随着技术的发展&#xff0c;新的哈希算法和应用场景也在不断出现。 二、定义 哈希函数是一种数学函数&#xff0c;它接受一个输…

学生蓝牙耳机买什么牌子好?四款平价蓝牙耳机品牌推荐

在当今快节奏的生活中&#xff0c;蓝牙耳机已经成为人们日常生活中不可或缺的配件之一。尤其对于学生党来说&#xff0c;寻找一款性价比高、价格平价的蓝牙耳机是非常重要的。在市面上琳琅满目的选择中&#xff0c;学生蓝牙耳机买什么牌子好&#xff1f;成为了许多学生党的困扰…