在浏览器中浏览器为了安全,会有一个跨域策略,浏览器只允许网页访问同源的接口并访问数据(注意:跨域请求不会自动携带 Cookie)
同源的定义:
(1)协议相同(http/https)
(2)域名相同
(3)端口相同
三者有任何不同就会存在跨域问题
SpringBoot 中如何解决跨域问题
1.通用跨域配置类
java
package com.qcq.sw.config;
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() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 必须
config.addAllowedOriginPattern("*"); // 必须
config.addAllowedHeader("*");
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
2.@CorssOrigin
使用@CorssOrigin注解给 单个接口或则整个Controller类 添加允许跨域的前端域名
java
@CorssOrigin(orgin = "http://localhost:5173")
3.使用WebMvcConfigurer(另外一种全局配置)
java
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("/**") // 所有接口
.allowedOrigins("http://localhost:3000") // 允许前端
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
为什么要限制跨域?
假设没有跨域限制,会出现严重的安全问题:
案例 1:窃取用户数据
- 你登录了银行网站,浏览器保存了 cookie(会话信息)
- 恶意网站偷偷在后台发 AJAX 请求到银行网站接口
- 如果浏览器允许跨域,恶意网站就能拿到你的账户信息
案例 2:伪造请求(CSRF)
- 恶意网站让用户浏览页面
- 自动触发对另一个站点的请求(带 cookie)
- 如果没有跨域限制,服务器可能被攻击
案例 3:保护浏览器环境
- 网站可以通过 JS 操作浏览器 DOM、读取数据
- 如果允许跨域访问任意接口,网页就可能窃取其他站点的敏感数据