什么是跨域?为什么要配?
你前端项目跑在 localhost:3000,后端接口在 localhost:8080,虽然是同一台电脑,但浏览器会觉得你们是“不同域”,默认就拦了请求。
“兄弟,你不是我这个域的,我不能让你进来。” —— 浏览器安全策略
所以我们要告诉后端:“这个前端是自己人,放他进来。”
推荐方式:写一个全局跨域配置类,一次搞定所有接口
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 所有路径都可以跨域
.allowedOriginPatterns("*") // 哪些域名可以访问(* 表示全部)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 支持的方法
.allowedHeaders("*") // 允许的请求头
.allowCredentials(true); // 允许携带 cookie
}
}
适合绝大多数后端项目用这一个就够了。
更细粒度控制:单个接口用 @CrossOrigin
@CrossOrigin(origins = "http://localhost:3000") // 指定允许跨域的前端地址
@GetMapping("/api/hello")
public String hello() {
return "Hello from backend!";
}
适合小项目或测试阶段,不想全局放开时用。
如果用了 Spring Security,还要加一段配置
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors(); // 开启 Spring Security 对 CORS 的支持
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
总结一句话
前端请求后端接口跨域时,如果你遇到:
报错 No 'Access-Control-Allow-Origin' header...
预检请求 OPTIONS 被拦
前端调试本地接口很卡
那就赶紧配置一下 CORS,后端一句配置,前端畅通无阻
作者:非鱼牛马社
链接:https://juejin.cn