如何在Spring Boot开发环境中仅为指定控制器启用@CrossOrigin?
实现Spring Boot开发环境专属的CORS配置
完全可以实现开发环境仅为/api/auth路径开启CORS,生产环境自动关闭的需求,推荐两种简单可靠的方案:
方案一:基于@Profile的全局CORS配置(推荐)
通过创建仅在开发环境生效的配置类,精准控制指定路径的CORS规则,生产环境不会加载该配置,从根源避免安全风险。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration @Profile("dev") // 仅当激活dev环境时生效 public class DevExclusiveCorsConfig { @Bean public CorsFilter corsAuthFilter() { CorsConfiguration corsConfig = new CorsConfiguration(); corsConfig.setAllowCredentials(true); corsConfig.addAllowedOrigin("*"); // 开发环境允许所有源 corsConfig.addAllowedHeader("*"); corsConfig.addAllowedMethod("*"); corsConfig.setMaxAge(3600L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 仅对/api/auth下的所有接口生效 source.registerCorsConfiguration("/api/auth/**", corsConfig); return new CorsFilter(source); } }
配置说明
- 在
application-dev.yml中激活开发环境:spring: profiles: active: dev - 生产环境无需修改任何配置,只要不激活
devprofile,该CORS配置就不会被加载,完全符合同源场景下的安全要求。
方案二:基于配置属性的控制器注解动态切换
如果偏好直接在控制器上使用@CrossOrigin,可以通过Spring的属性占位符实现环境动态切换:
在控制器类上添加带占位符的注解:
@RestController @RequestMapping("/api/auth") @CrossOrigin( origins = "${cors.auth.origins}", maxAge = "${cors.auth.max-age:3600}" ) public class AuthController { // 接口实现 }在
application-dev.yml中配置开发环境的CORS规则:cors: auth: origins: "*"在
application-prod.yml中配置生产环境的同源规则(或直接不配置,让origins为空,此时@CrossOrigin不会生效):cors: auth: origins: "https://your-production-domain.com"
注意事项
这种方式需要确保生产环境的origins配置为前端同源地址,或者留空(部分Spring版本中,空值会导致CORS规则不生效),相比方案一,全局配置的方式更直观且安全,避免因配置疏漏导致生产环境暴露不必要的CORS规则。
内容的提问来源于stack exchange,提问作者Socrates
相关产品推荐
相关产品推荐

