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

淺析SpringBoot如何解決CORS問題

 更新時間:2025年05月09日 09:41:14   作者:來自星星的坤  
在前后端分離的開發(fā)模式中,經(jīng)常會遇到 跨域資源共享(CORS) 的問題,本文將全面介紹 Spring Boot 中處理 CORS 的常見方法,大家可以根據(jù)需要進(jìn)行選擇

在前后端分離的開發(fā)模式中,前端調(diào)用后端接口時,經(jīng)常會遇到 跨域資源共享(CORS) 的問題。Spring Boot 作為常用的后端框架,提供了多種方式來優(yōu)雅地解決這個問題。本文將全面介紹 Spring Boot 中處理 CORS 的常見方法、原理分析及注意事項,幫助開發(fā)者高效排查和解決跨域問題。

一、什么是 CORS

CORS(Cross-Origin Resource Sharing,跨域資源共享)是瀏覽器的一種安全策略,用于防止頁面被惡意地從一個域加載資源到另一個域。簡單來說,只要前端請求的協(xié)議、域名、端口與后端接口不完全一致,就屬于跨域請求。

例如:

  • 前端地址:http://localhost:3000
  • 后端接口:http://localhost:8080/api/data

這就構(gòu)成了跨域請求,瀏覽器會默認(rèn)攔截這類請求,除非服務(wù)器端明確允許跨域訪問。

二、Spring Boot 中解決 CORS 的幾種方法

Spring Boot 提供了多種方式來配置和處理跨域問題,以下是最常用的三種方法:

方法一:使用 @CrossOrigin 注解(推薦用于小型項目或測試)

這是 Spring Boot 提供的快捷方式,可直接作用于控制器類或方法上:

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:3000")
public class MyController {
 
    @GetMapping("/data")
    public String getData() {
        return "Hello, CORS!";
    }
}

參數(shù)說明:

origins:允許的域名(可為 * 表示所有)。

methods:允許的方法,如 GET, POST 等。

maxAge:預(yù)檢請求的有效時間(單位秒)。

allowedHeaders:允許攜帶的頭信息。

缺點(diǎn):對于中大型項目來說,控制器眾多,維護(hù)成本高。

方法二:全局 CORS 配置(推薦用于中大型項目)

通過實現(xiàn) WebMvcConfigurer 接口,全局統(tǒng)一配置跨域規(guī)則,適用于大多數(shù)項目場景。

@Configuration
public class CorsConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 所有接口
                .allowedOrigins("http://localhost:3000") // 允許的前端地址
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 允許的方法
                .allowedHeaders("*") // 允許的請求頭
                .allowCredentials(true) // 允許攜帶 Cookie
                .maxAge(3600); // 預(yù)檢請求緩存時間(秒)
    }
}

優(yōu)點(diǎn):配置集中,維護(hù)簡單,推薦使用。

方法三:通過 Filter 手動設(shè)置響應(yīng)頭(不推薦,除非特殊需求)

手動注冊一個過濾器,向響應(yīng)中添加 CORS 相關(guān)頭信息:

@Component
public class CorsFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
        HttpServletResponse res = (HttpServletResponse) response;
        HttpServletRequest req = (HttpServletRequest) request;
 
        res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");
        res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "*");
        res.setHeader("Access-Control-Allow-Credentials", "true");
 
        // OPTIONS 預(yù)檢請求直接返回
        if ("OPTIONS".equalsIgnoreCase(req.getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(request, response);
        }
    }
}

缺點(diǎn):易出錯,不易維護(hù),建議使用 WebMvcConfigurer 方式代替。

三、常見問題排查

OPTIONS 請求返回 403 或沒有響應(yīng)?

確保后端允許 OPTIONS 方法。

確保沒有被 Spring Security 攔截。

攜帶 Cookie 不生效?

后端必須設(shè)置:.allowCredentials(true)

前端必須設(shè)置:axios.defaults.withCredentials = true

Spring Security 攔截 CORS 請求?

需要額外配置 CORS 策略,示例如下:

@EnableWebSecurity
public class SecurityConfig {
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .cors() // 啟用 CORS
            .and()
            .csrf().disable()
            .authorizeHttpRequests()
            .anyRequest().permitAll();
 
        return http.build();
    }
 
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(List.of("http://localhost:3000"));
        config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        config.setAllowedHeaders(List.of("*"));
        config.setAllowCredentials(true);
 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}

四、總結(jié)

方法場景推薦度
@CrossOrigin 注解控制器少,接口固定??
實現(xiàn) WebMvcConfigurer中大型項目,統(tǒng)一配置?????
自定義 Filter特殊需求(如動態(tài)域)?

CORS 配置看似簡單,但與前端請求設(shè)置、Spring Security 配合使用時需格外注意。建議在項目初始化階段就進(jìn)行統(tǒng)一的跨域策略設(shè)計,避免后續(xù)頻繁調(diào)整。

到此這篇關(guān)于淺析SpringBoot如何解決CORS問題的文章就介紹到這了,更多相關(guān)SpringBoot解決CORS內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring響應(yīng)式編程之Reactor操作符詳解

    Spring響應(yīng)式編程之Reactor操作符詳解

    文章介紹了Reactor庫中常用的響應(yīng)式流操作符,分為創(chuàng)建、轉(zhuǎn)換、組合、條件和錯誤處理五類,詳細(xì)列舉了每類操作符的功能和用途,這些操作符旨在提高響應(yīng)式流的可讀性和開發(fā)效率,幫助開發(fā)者更高效地處理數(shù)據(jù)流
    2025-09-09
  • java 定時同步數(shù)據(jù)的任務(wù)優(yōu)化

    java 定時同步數(shù)據(jù)的任務(wù)優(yōu)化

    這篇文章主要介紹了java 定時同步數(shù)據(jù)的任務(wù)優(yōu)化,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Java線程池7個參數(shù)的詳細(xì)含義

    Java線程池7個參數(shù)的詳細(xì)含義

    java多線程開發(fā)時,常常用到線程池技術(shù),這篇文章是對創(chuàng)建java線程池時的七個參數(shù)的詳細(xì)解釋,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • mybatis plus條件構(gòu)造器queryWrapper、updateWrapper

    mybatis plus條件構(gòu)造器queryWrapper、updateWrapper

    這篇文章主要介紹了mybatis plus條件構(gòu)造器queryWrapper、updateWrapper,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot+pdfbox實現(xiàn)解析pdf中的段落和表格數(shù)據(jù)

    SpringBoot+pdfbox實現(xiàn)解析pdf中的段落和表格數(shù)據(jù)

    在日常業(yè)務(wù)需求中,往往會遇到解析pdf文件中的段落或者表格數(shù)據(jù)的需求,這篇文章主要和大家介紹了SpringBoot結(jié)合tabula和pdfbox解析pdf中的段落和表格數(shù)據(jù)的詳細(xì)方法,需要的可以了解下
    2025-06-06
  • Java處理JSON編程實用技巧和性能優(yōu)化

    Java處理JSON編程實用技巧和性能優(yōu)化

    JSON解析是Java Web開發(fā)的核心技能,用于服務(wù)端和客戶端間數(shù)據(jù)交換,下面這篇文章主要介紹了Java處理JSON編程實用技巧和性能優(yōu)化的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • Java 泛型詳解(超詳細(xì)的java泛型方法解析)

    Java 泛型詳解(超詳細(xì)的java泛型方法解析)

    這篇文章主要介紹了深入理解java泛型Generic,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下,希望對你有幫助
    2021-07-07
  • java連接Access數(shù)據(jù)庫的方法

    java連接Access數(shù)據(jù)庫的方法

    這篇文章主要為大家詳細(xì)介紹了java連接Access數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java建立子類方法總結(jié)

    java建立子類方法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于java建子類的步驟和方法,需要的朋友們跟著學(xué)習(xí)下。
    2019-05-05
  • Java Excel透視表相關(guān)操作實現(xiàn)代碼

    Java Excel透視表相關(guān)操作實現(xiàn)代碼

    這篇文章主要介紹了Java Excel透視表相關(guān)操作實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論

饶河县| 潼关县| 宁城县| 贡嘎县| 铁岭市| 安西县| 五原县| 工布江达县| 晋江市| 阿瓦提县| 玛沁县| 屏山县| 哈尔滨市| 新巴尔虎右旗| 璧山县| 永安市| 习水县| 吴旗县| 大同县| 徐汇区| 池州市| 英吉沙县| 泰和县| 五华县| 恩施市| 中方县| 甘孜县| 沁阳市| 安徽省| 虞城县| 海阳市| 揭东县| 苏尼特右旗| 张家港市| 镇雄县| 南丹县| 光泽县| 肃南| 雅江县| 北宁市| 垫江县|