最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot解決跨域的五種方式

 更新時(shí)間:2025年10月17日 08:50:13   作者:李廣坤  
在?Spring?Boot?中解決跨域(CORS,Cross-Origin?Resource?Sharing)問題有?多種方式,適用于不同場景,下面系統(tǒng)地介紹?5?種主流方法,從簡單到靈活,附代碼示例和適用場景,需要的朋友可以參考下

在 Spring Boot 中解決跨域(CORS,Cross-Origin Resource Sharing)問題有 多種方式,適用于不同場景。下面系統(tǒng)地介紹 5 種主流方法,從簡單到靈活,附代碼示例和適用場景。

方法 1:使用 @CrossOrigin 注解(最簡單)

適用場景: 單個(gè) Controller 或方法需要跨域

@RestController
@CrossOrigin(origins = "http://localhost:3000") // 允許指定來源
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        return new User("John");
    }

    // 或只對(duì)某個(gè)方法生效
    @CrossOrigin(origins = "*") // 允許所有來源(生產(chǎn)環(huán)境慎用?。?
    @PostMapping("/save")
    public String save() {
        return "ok";
    }
}

優(yōu)點(diǎn):

  • 簡單、直觀
  • 可細(xì)粒度控制(類級(jí)別 or 方法級(jí)別)

缺點(diǎn):

  • 無法全局統(tǒng)一管理
  • 不適合大型項(xiàng)目

方法 2:全局配置 CORS(推薦?。?/h2>

適用場景: 整個(gè)應(yīng)用統(tǒng)一處理跨域(最常用)

方式 A:實(shí)現(xiàn) WebMvcConfigurer 接口(Spring Boot 2.x+)

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 攔截所有路徑
                .allowedOrigins("*")
                // .allowedOrigins("http://localhost:3000", "https://your-app.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                // .allowCredentials(true) // 是否允許攜帶 cookie,?? 注意:這里不能同時(shí)設(shè)為 true!
                .maxAge(3600); // 預(yù)檢請求緩存時(shí)間(秒)
    }
}

方式 B:使用 @Bean 注冊 CorsConfigurationSource

@Configuration
public class CorsConfig {

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        // config.setAllowedOrigins(Arrays.asList("*")); // ?? 允許所有域
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
        config.setAllowedHeaders(Arrays.asList("*"));
        config.setAllowCredentials(true);
        // config.setAllowCredentials(true); // ?? 不能與 "*" 同時(shí)使用!

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

優(yōu)點(diǎn):

  • 全局生效,配置集中
  • 靈活控制路徑、方法、頭部等
  • 生產(chǎn)環(huán)境推薦方式

方法 3:通過 Filter 自定義 CORS(底層控制)

適用場景: 需要完全自定義 CORS 響應(yīng)頭,或與 Spring Security 集成

@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", "*");
        // 注意:沒有 Allow-Credentials!
        
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");

        // 如果是預(yù)檢請求(OPTIONS),直接返回
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
}

注意:如果使用 Spring Security,需確保此 Filter 在 Security Filter 之前執(zhí)行。

優(yōu)點(diǎn):

  • 完全控制響應(yīng)頭
  • 可處理復(fù)雜邏輯(如動(dòng)態(tài) origin)

缺點(diǎn):

  • 代碼較繁瑣
  • 容易出錯(cuò)(如漏掉 OPTIONS 處理)? 方法 4:在 application.yml / application.properties 中配置(僅限 Spring Boot 2.4+)

注意:Spring Boot 本身不支持通過配置文件直接開啟 CORS! 但如果你使用 Spring Cloud Gateway 或 某些 starter,可能有擴(kuò)展支持。

普通 Spring Boot Web 項(xiàng)目不能這樣配置!

所以:不要嘗試在 application.yml 里寫 cors 配置(除非你用的是特定網(wǎng)關(guān)組件)。

場景 1:Spring WebFlux(響應(yīng)式)項(xiàng)目

application.yml

spring:
  webflux:
    cors:
      allowed-origins: "*"
      allowed-methods: "GET,POST,PUT,DELETE,OPTIONS"
      allowed-headers: "*"
      max-age: 3600

場景 2:Spring Boot Actuator 端點(diǎn)的 CORS 配置

即使你用的是 Spring MVC,Actuator 的監(jiān)控端點(diǎn)也支持通過配置文件開啟 CORS:

application.yml

management:
  endpoints:
    web:
      cors:
        allowed-origins: "http://localhost:3000"
        allowed-methods: "*"
        allowed-headers: "*"
項(xiàng)目類型是否支持 application.yml 配置 CORS推薦方式
Spring MVCspring-boot-starter-web? 不支持使用 WebMvcConfigurer@CrossOrigin
Spring WebFluxspring-boot-starter-webflux? 支持spring.webflux.cors.*
Actuator 端點(diǎn)? 支持(僅限監(jiān)控接口)management.endpoints.web.cors.*

方法 4:結(jié)合 Spring Security 配置 CORS(安全場景必備)

如果你的項(xiàng)目用了 Spring Security,必須顯式啟用 CORS,否則 Security 會(huì)攔截 OPTIONS 請求!

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .cors().and() // ?? 關(guān)鍵:啟用 CORS 支持
            .csrf().disable()
            .authorizeHttpRequests(auth -> auth
                .anyRequest().permitAll()
            );
        return http.build();
    }

    // 同時(shí)提供全局 CorsConfigurationSource
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

為什么需要?

  • Spring Security 默認(rèn)不處理 CORS
  • 如果不配置,瀏覽器預(yù)檢請求(OPTIONS)會(huì)被 Security 攔截 → 跨域失敗

常見錯(cuò)誤

問題說明
allowedOrigins("*") + allowCredentials(true) 沖突瀏覽器不允許:Access-Control-Allow-Origin* 時(shí),不能帶 cookie。必須指定具體 origin
忘記處理 OPTIONS 請求預(yù)檢請求失敗,導(dǎo)致跨域報(bào)錯(cuò)
CORS 配置被 Security 覆蓋必須在 Spring Security 中顯式啟用 .cors(),否則 OPTIONS 請求會(huì)被攔截
生產(chǎn)環(huán)境使用 allowedOrigins("*")存在安全風(fēng)險(xiǎn),應(yīng)明確指定可信的前端域名

最佳實(shí)踐

場景推薦方案
快速測試 / 小型項(xiàng)目使用 @CrossOrigin 注解
標(biāo)準(zhǔn) Web 項(xiàng)目(未集成 Spring Security)實(shí)現(xiàn) WebMvcConfigurer 進(jìn)行全局 CORS 配置
項(xiàng)目已集成 Spring Security在 Security 配置中調(diào)用 .cors(),并提供 CorsConfigurationSource Bean
需要?jiǎng)討B(tài) Origin(如多租戶、白名單配置)自定義 CorsFilter 實(shí)現(xiàn)靈活控制

一句話記?。?/h2>

普通項(xiàng)目用 WebMvcConfigurer,帶 Security 的項(xiàng)目必須在 Security 中 .cors() 并提供 CorsConfigurationSource。

以上就是SpringBoot解決跨域的五種方式的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot解決跨域的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java程序運(yùn)行之JDK,指令javac java解讀

    Java程序運(yùn)行之JDK,指令javac java解讀

    這篇文章主要介紹了Java程序運(yùn)行之JDK,指令javac java,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 詳解RabbitMQ核心機(jī)制

    詳解RabbitMQ核心機(jī)制

    MQ 主要用于分布式系統(tǒng)之間的通信,解決數(shù)據(jù)傳遞的效率和可靠性問題,本文給大家介紹RabbitMQ核心機(jī)制,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Spring的同一個(gè)服務(wù)會(huì)加載多次的問題分析及解決方法

    Spring的同一個(gè)服務(wù)會(huì)加載多次的問題分析及解決方法

    這篇文章主要介紹了Spring的同一個(gè)服務(wù)為什么會(huì)加載多次,我們先來梳理一下?Web?容器中如何加載?Bean,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • 在SpringBoot中使用YourKit進(jìn)行性能調(diào)優(yōu)的教程詳解

    在SpringBoot中使用YourKit進(jìn)行性能調(diào)優(yōu)的教程詳解

    在應(yīng)用程序的開發(fā)過程中,性能調(diào)優(yōu)是一個(gè)重要的環(huán)節(jié),在SpringBoot應(yīng)用程序中,我們可以使用YourKit來進(jìn)行性能調(diào)優(yōu),YourKit是一款非常強(qiáng)大的Java性能調(diào)優(yōu)工具,在本文中,我們將介紹如何在 SpringBoot應(yīng)用程序中使用YourKit進(jìn)行性能調(diào)優(yōu)
    2023-06-06
  • IDEA集成git和使用步驟的實(shí)現(xiàn)方法

    IDEA集成git和使用步驟的實(shí)現(xiàn)方法

    這篇文章主要介紹了IDEA集成git和使用步驟的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • rabbitmq消息隊(duì)列原理分析

    rabbitmq消息隊(duì)列原理分析

    這篇文章主要介紹了rabbitmq消息隊(duì)列原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-12-12
  • MyBatis圖文并茂講解注解開發(fā)一對(duì)多查詢

    MyBatis圖文并茂講解注解開發(fā)一對(duì)多查詢

    這篇文章主要介紹了SpringBoot中Mybatis注解一對(duì)多查詢的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • SpringBoot如何使用ApplicationContext獲取bean對(duì)象

    SpringBoot如何使用ApplicationContext獲取bean對(duì)象

    這篇文章主要介紹了SpringBoot 如何使用ApplicationContext獲取bean對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java基于IO流實(shí)現(xiàn)登錄和注冊功能

    Java基于IO流實(shí)現(xiàn)登錄和注冊功能

    這篇文章主要為大家詳細(xì)介紹了Java基于IO流實(shí)現(xiàn)登錄和注冊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot之logback-spring.xml不生效的解決方法

    SpringBoot之logback-spring.xml不生效的解決方法

    這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01

最新評(píng)論

高清| 大足县| 新野县| 鄂托克前旗| 砀山县| 彩票| 崇义县| 石景山区| 宜都市| 伊宁市| 恩平市| 连云港市| 勐海县| 成都市| 轮台县| 秦安县| 龙海市| 得荣县| 同江市| 霍邱县| 德保县| 荔波县| 静安区| 商水县| 项城市| 江门市| 华蓥市| 三穗县| 金阳县| 钦州市| 临泽县| 都匀市| 江油市| 怀化市| 剑阁县| 新郑市| 肇东市| 朝阳县| 东乡族自治县| 米易县| 福清市|