什么是跨域?协议、域名、端口,三者必须完全一致才算不跨域 。浏览器默认禁止跨域请求 返回的响应,除非后端接口明确通过 CORS 响应头 声明 "允许该前端源访问该响应"。
跨域拦截的 "执行者是浏览器",但 "是否允许跨域的决定权在后端 ------ 前端无法绕过浏览器的同源策略,必须由后端通过配置 "授权",浏览器才会把响应交给前端,所以我们需要在后端配置CORS 响应头允许哪些前端地址获取响应。
解决办法:
1.全局配置类
java
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;
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
// 1. 配置跨域
CorsConfiguration config = new CorsConfiguration();
// 允许的前端源(开发环境下用*允许所有,生产环境需指定具体域名,如http://localhost:8081)
config.addAllowedOriginPattern("*"); // 注意:用addAllowedOriginPattern而非addAllowedOrigin(后者在新版Spring中已过时)
// 允许的请求方法(GET/POST/PUT/DELETE等)
config.addAllowedMethod("*");
// 允许的请求头(如Content-Type、Authorization等)
config.addAllowedHeader("*");
// 允许前端携带Cookie(如需身份认证,需开启)
config.setAllowCredentials(true);
// 预检请求的有效期(秒),避免频繁预检
config.setMaxAge(3600L);
// 2. 配置生效的接口路径(/**表示所有接口)
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 3. 返回过滤器
return new CorsFilter(source);
}
}
2.如果不想全局允许跨域,可在 Controller 类或方法上添加 @CrossOrigin(origins = "*", maxAge = 3600) 注解