package com.xly.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; /** * CORS:**origin 白名单**(可配置 {@code xly.cors.allowed-origins},逗号分隔,支持通配段)。 * *
不再对所有域名放行——通配 + allowCredentials 意味着浏览器里任意网页都能跨域驱动本服务 * (本地 dev-login 开启时无凭证即可入队 ERP 写操作)。生产走 nginx 同源代理本就不需要 CORS; * 出现合法跨域消费方时把它的 origin 加进配置即可。 */ @Configuration public class CorsConfig { /** 默认只放行本机开发场景的 origin。 */ @Value("${xly.cors.allowed-origins:http://localhost:*,http://127.0.0.1:*,http://host.docker.internal:*}") private String allowedOrigins; @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); for (String o : allowedOrigins.split(",")) { String t = o.trim(); if (!t.isEmpty()) { config.addAllowedOriginPattern(t); } } config.addAllowedMethod("*"); config.addAllowedHeader("*"); config.setAllowCredentials(true); config.addExposedHeader("*"); config.setMaxAge(3600L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }