首页 > 其他分享 >Spring (63)CORS,如何在Spring中配置它

Spring (63)CORS,如何在Spring中配置它

时间:2024-06-17 11:28:23浏览次数:12  
标签:Spring 配置 springframework CORS 63 org import

CORS简介

CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种机制,它使用额外的HTTP头来告诉浏览器让运行在一个origin(源)上的Web应用被准许访问来自不同源服务器上的指定资源。当一个资源从与该资源本身不同的域、协议或端口请求一个资源时,资源会发起一个跨域HTTP请求。

CORS机制主要是为了安全考虑,防止恶意网站读取另一个网站上的敏感数据。不过,网站可以声明愿意让其资源通过CORS被其他网站访问。

在Spring中配置CORS

在Spring框架中,特别是在使用Spring MVC或Spring WebFlux时,有多种方式可以配置CORS。我们将通过全局配置和局部配置两种方式来深入探讨。

全局CORS配置

全局CORS配置影响整个Spring应用的所有控制器。这种方式通常在WebMvcConfigurer(对于Spring MVC)或WebFluxConfigurer(对于Spring WebFlux)的实现中完成。

Spring MVC示例

在Spring MVC中,你可以通过实现WebMvcConfigurer接口,并重写addCorsMappings方法来实现全局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 WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("https://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("Header1", "Header2", "Header3")
                .exposedHeaders("Header1", "Header2")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

这个配置允许来自https://example.com的跨域请求访问/api/**路径下的资源,并且配置了其他CORS相关的设置。

Spring WebFlux示例

在Spring WebFlux中,配置方式类似,但需要实现WebFluxConfigurer接口。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.config.CorsRegistry;
import org.springframework.web.reactive.config.WebFluxConfigurer;

@Configuration
public class WebFluxConfig implements WebFluxConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("https://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("Header1", "Header2", "Header3")
                .exposedHeaders("Header1", "Header2")
                .allowCredentials(true)
                .maxAge(3600);
    }
}
局部CORS配置

除了全局配置之外,Spring也允许对单独的控制器或者处理器方法应用CORS配置。这是通过在控制器类或方法上使用@CrossOrigin注解来实现的。

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @CrossOrigin(origins = "https://example.com")
    @GetMapping("/api/resource")
    public String getResource() {
        return "Some Resource";
    }
}

在这个例子中,@CrossOrigin注解使得https://example.com可以跨域请求/api/resource这个端点。这种方式提供了更细粒度的控制,适用于只有部分路由需要特定的CORS配置的情况。

深入源码

Spring内部处理CORS的机制相对复杂,主要涉及以下几个核心类:

  • CorsConfiguration: 此类表示CORS配置,包含了如允许的源(origins)、HTTP方法(methods)、头部(headers)等配置信息。
  • CorsConfigurationSourceUrlBasedCorsConfigurationSource: 这些接口和类提供了一种机制,用于根据请求的URL路径来查找相应的CorsConfiguration
  • CorsProcessor: 它是处理实际CORS请求的组件,使用相关的CorsConfiguration来验证请求并设置必要的CORS响应头。

当一个跨域请求到达Spring应用时,Spring的DispatcherServlet会委托CorsProcessor来处理这个请求。CorsProcessor会根据请求的URL和配置的CorsConfigurationSource来确定适用的CORS配置,并据此设置响应头。

这个处理流程确保了Spring应用能够灵活地支持CORS,无论是全局配置还是局部配置。通过深入了解和适当地配置这些组件,开发人员可以精确地控制哪些外部源可以访问应用中的不同部分。

标签:Spring,配置,springframework,CORS,63,org,import
From: https://blog.csdn.net/qq_43012298/article/details/136966306

相关文章

  • Spring (62)Spring 5引入的新特性
    Spring5是Spring框架的一次重大更新,它引入了许多新特性和改进。以下是一些显著的新特性:响应式编程支持:SpringFramework5引入了SpringWebFlux,这是一个新的响应式框架,用于在Spring中构建响应式应用。它允许使用响应式编程模型来处理异步和非阻塞的操作。基于Java8的......
  • 盘点 Spring Boot 解决跨域请求的几种办法
    熟悉web系统开发的同学,对下面这样的错误应该不会太陌生。之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击web服务器盗取数据。01、什么是跨域请求同源策略,简单的说就是当浏览器访问web服务器资源时,只有源相同才能正常进行通信,即......
  • 使用SpringBoot对接Kafka
    Kafka是什么,以及如何使用SpringBoot对接Kafka一、Kafka与流处理我们先来看看比较正式的介绍:Kafka是一种流处理平台,由LinkedIn公司创建,现在是Apache下的开源项目。Kafka通过发布/订阅机制实现消息的异步传输和处理。它具有高吞吐量、低延迟、可伸缩性和可靠性等优点,使其成为......
  • 阿里也出手了!Spring CloudAlibaba AI问世了
    写在前面在之前的文章中我们有介绍过SpringAI这个项目。SpringAI是Spring官方社区项目,旨在简化JavaAI应用程序开发,让Java开发者想使用Spring开发普通应用一样开发AI应用。而SpringAI主要面向的是国外的各种大模型接入,对于国内开发者可能不太友好。于是乎,SpringCl......
  • 基于springboot的球队训练信息管理系统源码数据库
    传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装球队训练信息管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,球队训练信息管理系......
  • 基于springboot的青年公寓服务平台源码数据库
    传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,房屋信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的青年公寓服务平台。本青年公寓服务......
  • spring boot(学习笔记第八课)
    springboot(学习笔记第八课)数据库操作-MyBatis,SpringDataJPA,多数据源学习内容:数据库操作-MyBatis数据库操作-SpringDataJPA多数据源(JdbcTemplate)1.数据库操作-MyBatisspringboot的操作有JdbcTemplate,MyBatis,SpringDataJPA主要这三个包。其中,JdbcTempla......
  • 代码随想录算法训练营第39天 | 62.不同路径 、63. 不同路径 II
    今天开始逐渐有dp的感觉了,前两题不同路径,可以好好研究一下,适合进阶详细布置62.不同路径本题大家掌握动态规划的方法就可以。数论方法有点非主流,很难想到。https://programmercarl.com/0062.不同路径.html视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu/***@p......
  • Jersey+Spring构建RESTful Web服务
    简介目前jersey已经不流行,但一些老的项目还在使用,jersey和目前流行的springboot还是有少许不同,特此记录。搭建服务pom<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>......
  • 基于springboot的无人智慧超市管理系统【附源码】
    效果如下:首页注册商品信息个人中心管理员主页面仓储信息管理订单管理界面研究背景近年来,由于计算机技术和互联网技术的快速发展,使得所有企事业单位内部都是数字化、信息化、无纸化的发展趋势,随着趋势的发展,各种决策系统、辅助系统也应运而生,其中无人智慧超......