SpringBoot解决跨域问题
为什么会出现跨域问题
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)
什么是跨域
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 跨域配置
*/
@Configuration
public class CorsConfig {
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
// 1.准备一个“规则源”,用于给不同路径配置 CORS 规则
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 2.创建一个“跨域配置”对象,往里填各种允许/不允许的选项
CorsConfiguration config = new CorsConfiguration();
// 【允许携带 Cookie 或 Authorization 这类 “凭证”】
config.setAllowCredentials(true);
// 【允许的来源域名】
// 用通配符 "*",表示不管从哪个域来的,都允许。
// 这里用的是 addAllowedOriginPattern,而不是 addAllowedOrigin,
// 是为了和 allowCredentials(true) 一起使用时不报错。
config.addAllowedOriginPattern("*");
// 【允许的请求头】
// 客户端可以带哪些自定义的 HTTP 头,比如 Content-Type、X-Token…
config.addAllowedHeader("*");
// 【允许的请求方法】
// GET、POST、PUT、DELETE、OPTIONS……所有都放行
config.addAllowedMethod("*");
// 把上面这套“跨域规则”注册到所有接口路径(/**)
source.registerCorsConfiguration("/**", config);
// 3.用这套规则,创建一个 CorsFilter 过滤器,
// 4.并把它交给 Spring 管理,优先级设为最高
FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
核心流程
-
拦截所有 HTTP 请求 —— 只要有请求进来,先跑到这个 CORS 过滤器。
-
检查请求来源(Origin) —— 看看它是不是在我们允许的域名列表里。
-
检查方法和头 —— 看 GET/POST/PUT/DELETE/OPTIONS 这些请求方式、以及它带的自定义头,是否都被允许。
-
允许携带 Cookie —— 因为 setAllowCredentials(true),所以如果前端带了 Cookie,也不会被抛弃。
-
回复浏览器“放心发吧” —— 如果全部检查通过,响应里会自动带上 Access-Control-Allow‑* 这类头,告诉浏览器“OK,你可以拿到数据”;否则浏览器会拦截,不让前端收到。
为什么要设最高优先级?
-
如果同时用了 Spring Security、其他 Filter、Interceptor,甚至日志拦截器,都可能也会拉一次请求。
-
我们希望「跨域检查」最先执行,先把 CORS 的头加好、OPTIONS 请求处理好,再交给后面的安全模块或业务模块。
这样做之后,就不需要在每个 Controller 或每个接口方法上都加 @CrossOrigin 注解,也不用一个个调试预检(OPTIONS)请求了,整个应用全局一次配置,所有地址都能跨域并带上 Cookie。

浙公网安备 33010602011771号