跨域问题是浏览器为了保护用户的信息安全,实施了同源策略(Same-Origin Policy),即只允许页面请求同源(相同协议、域名和端口)的资源,当 JavaScript 发起的请求跨越了同源策略,即请求的目标与当前页面的域名、端口、协议不一致时,浏览器会阻止请求的发送或接收。
解决跨域问题方案
跨域问题可以从以下方面解决:
-
应用层面解决:例如 Spring Boot 项目中解决跨域问题。
-
反向代理解决:例如 Nginx 中解决跨域问题。
-
网关中解决:例如 Spring Cloud Gateway 中解决跨域问题。
而这 3 类解决方案,总共包含了 8 种解决方案,一起来看。
1.Spring Boot 中解决跨域
在 Spring Boot 中跨域问题有以下 5 种解决方案:
-
使用 @CrossOrigin 注解实现跨域【局域类跨域】
-
通过配置文件实现跨域【全局跨域】
-
通过 CorsFilter 对象实现跨域【全局跨域】
-
通过 Response 对象实现跨域【局域方法跨域】
-
通过实现 ResponseBodyAdvice 实现跨域【全局跨域】
接下来详细来看。
1.1 通过注解跨域
使用 @CrossOrigin 注解可以轻松的实现跨域,此注解既可以修饰类,也可以修饰方法。当修饰类时,表示此类中的所有接口都可以跨域;当修饰方法时,表示此方法可以跨域,它的实现如下:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
@RestController
@CrossOrigin(origins = "*")
public class TestController {
@RequestMapping("/test")
public HashMap<String, Object> test() {
return new HashMap<String, Object>() {
{
put("state", 200);
put("data", "success");
put("msg", "");
}};
}
}
以上代码的执行结果如下图所示:
从上图中可以看出,前端项目访问另一个后端项目成功了,也就说明它解决了跨域问题。
优缺点分析
此方式虽然虽然实现(跨域)比较简单,但细心的朋友也能发现,使用此方式只能实现局部跨域,当一个项目中存在多个类的话,使用此方式就会比较麻烦(需要给所有类上都添加此注解)。
1.2 通过配置文件跨域
通过设置配置文件的方式就可以实现全局跨域了,它的实现步骤如下:
-
创建一个新配置文件。
-
添加 @Configuration 注解,实现 WebMvcConfigurer 接口。
-
重写 addCorsMappings 方法,设置允许跨域的代码。
具体实现代码如下:
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("/**") // 所有接口
.allowCredentials(true) // 是否发送 Cookie
.allowedOriginPatterns("*") // 支持域
.allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法
&n