首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Boot / Java Web 解決跨域 (CORS) 的標準實踐:Filter 方案與全域配置詳解

     編輯:Java 相關知識

從 JSONP 到 CORS:跨域解決方案的演進

早期常用 JSONP 解決跨域,但僅支援 GET、安全性差、錯誤處理困難。現代 Web 開發標準採用 CORS (Cross-Origin Resource Sharing),透過 HTTP 標頭讓瀏覽器允許跨源請求,支援所有 HTTP 方法、更安全、易除錯。

核心實作:一次性配置的 CorsFilter

@Component
@Order(Ordered.HIGHEST_PRECEDENCE) // 確保最先攔截
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;

        // 1. 允許跨域來源 (* 表示全部,生產建議指定具體域名)
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 2. 允許的 HTTP 方法
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, PATCH");
        // 3. 允許的請求標頭 (含自定義 Token 標頭)
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With, X-Custom-Header, HaiYi-Access-Token");
        // 4. 允許攜帶 Cookie (需前端 withCredentials=true,且 Origin 不能為 *)
        // response.setHeader("Access-Control-Allow-Credentials", "true");
        // 5. 預檢請求快取時間 (秒)
        response.setHeader("Access-Control-Max-Age", "3600");

        // 6. 處理預檢請求
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_NO_CONTENT);
            return; // 直接返回,不進入 Controller
        }

        chain.doFilter(req, res);
    }
    // init/destroy 可留空
}

Spring Boot 註冊方式 (無需 web.xml)

加上 @Component 即可自動註冊。若需精確控制路徑順序,可用 FilterRegistrationBean:

@Bean
public FilterRegistrationBean corsFilterRegistration() {
    FilterRegistrationBean bean = new FilterRegistrationBean<>(new CorsFilter());
    bean.addUrlPatterns("/*");
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return bean;
}

Spring MVC 更簡潔的全域配置 (WebMvcConfigurer)

無需寫 Filter,僅需實作介面:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*") // 生產環境請指定具體域名
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")
                .allowedHeaders("*")
                .allowCredentials(false) // true 時 origins 不能為 *
                .maxAge(3600);
    }
}

關鍵細節與避坑指南

場景配置要點
前端需攜帶 Cookie/Session後端 allowCredentials(true) + 前端 withCredentials: true + Origins 必須指定具體域名,不能為 *
複雜請求觸發預檢確保 OPTIONS 正確返回 204/200 且含 CORS 標頭,Filter 中需提前返回
Spring Security 環境需在 HttpSecurity 中配置 .cors(),並確保 CorsFilter/Configurer 在 Security Filter Chain 之前
Gateway/Zuul 微服務網關在網關層統一配置 CORS,下游服務無需重複配置

總結

CORS 是現代 Web 跨域的標準解法。Spring Boot 環境下,推薦使用 WebMvcConfigurer 統一聲明式配置,簡潔且集中管理。理解預檢機制、憑證模式與 Spring Security 整合細節,能避開 90% 的跨域坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved