package com.trafficaudit.common.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.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import java.util.Arrays; import java.util.List; /** * 跨域配置:只允许配置中列出的来源访问接口。 * 前后端分离本地开发默认放行 8080;前端经 dev-server 代理或与后端同源部署时均不需要额外放行。 * 注意:不开启 allowCredentials(接口用 Bearer 令牌鉴权,不依赖 Cookie),避免任意站点携带凭证调用。 */ @Configuration public class CorsConfig { @Value("${app.cors.allowed-origins:http://localhost:8080,http://127.0.0.1:8080}") private String allowedOrigins; private List originList() { return Arrays.asList(allowedOrigins.split(",")); } @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(originList()); config.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type", "Accept", "X-Requested-With")); config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); config.setAllowCredentials(false); config.setMaxAge(3600L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return source; } @Bean public CorsFilter corsFilter() { return new CorsFilter(corsConfigurationSource()); } }