SpringBoot解决跨域的方法详细教程
SpringBoot解决跨域的方法详细教程
2024-10-16 00:55
Spring Boot 项目中解决跨域(CORS)问题的详细教程。本文将介绍如何通过编写自定义配置类来实现跨域支持,确保客户端应用能够无障碍地访问服务器资源。?✨ 在 Spring Boot 中解决跨域问题的详细步骤
以下是关于在 Spring Boot 项目中解决跨域(CORS)问题的详细教程。本文将介绍如何通过编写自定义配置类来实现跨域支持,确保客户端应用能够无障碍地访问服务器资源。?✨
在 Spring Boot 中解决跨域问题的详细步骤
一、什么是跨域问题?
跨域问题是指由于浏览器的同源策略,客户端请求不同域的资源时被浏览器阻止的现象。例如,前端在 http://localhost:3000
上运行,而 后端 API 位于 http://localhost:8080
,这就属于不同源的请求,需要处理 跨域。
为了解决这一问题,我们可以在 Spring Boot 后端进行跨域配置,使浏览器能够接受来自不同源的请求。
二、使用 CorsConfig
配置类来解决跨域问题
1. 创建配置类
在 Spring Boot 项目中,创建一个配置类来处理跨域问题,例如命名为 CorsConfig
。此类使用 @Configuration
注解使其成为一个 Spring 的配置类。
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://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("Origin", "Content-Type", "Authorization")
.allowCredentials(true);
}
}
详细解释:
-
@Configuration:将该类标记为 Spring 配置类,使 Spring 在启动时能扫描并加载它的内容。
-
实现 WebMvcConfigurer 接口:WebMvcConfigurer
接口提供了自定义 MVC 配置的能力,其中包括跨域配置。我们通过实现该接口,覆盖它的 addCorsMappings
方法,以达到配置跨域规则的目的。
-
addCorsMappings 方法:在 addCorsMappings
方法中,我们使用 CorsRegistry
对象来配置跨域规则:
- addMapping("/")**:允许所有路径下的跨域请求。
- allowedOrigins("http://example.com"):允许来自
http://example.com
的请求,可以使用通配符 "*"
来允许所有源访问。
- allowedMethods("GET", "POST", "PUT", "DELETE"):指定允许的 HTTP 请求方法。
- allowedHeaders("Origin", "Content-Type", "Authorization"):指定允许的请求头。
- allowCredentials(true):允许发送 Cookie,用于跨域认证。
四、跨域配置的原理分析
跨域配置的目的是为了使服务器对浏览器发送的跨域请求进行授权。浏览器在发起跨域请求之前,会发送一个预检请求 (OPTIONS 请求),询问服务器是否允许这种跨域操作。服务器根据配置,返回允许的源、请求方法和请求头等信息。如果配置正确,浏览器则会继续发送实际请求。
跨域配置的作用流程如下:
- 浏览器发起预检请求,询问服务器是否允许跨域。
- 服务器根据配置,返回允许的跨域信息(源、方法、请求头等)。
- 浏览器根据服务器的响应,决定是否继续发送实际请求。
- 服务器处理实际请求,返回相应的数据。
五、跨域配置的应用场景和细化解释
应用场景 1:前后端分离项目中前端请求后端
例如,前端(Vue.js、React等)运行在 http://localhost:3000
,而后端 API 服务运行在 http://localhost:8080
。由于不同的端口号导致了不同的源地址,因此前端请求后端时,必须在后端配置 跨域规则,如上所示。

应用场景 2:允许多个源访问
如果你想让多个来源访问你的 API,可以使用如下代码:
registry.addMapping("/**")
.allowedOrigins("http://example.com", "http://another.com")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true);
? 详细解释:
- allowedOrigins:支持多个源访问。
- allowedMethods("*"):允许所有 HTTP 方法。
- allowedHeaders("*"):允许所有请求头。
六、跨域配置注意事项
- 安全性:尽量避免使用通配符
"*"
允许所有源和方法。对于生产环境,应仅允许受信任的源地址。 - Cookie 支持:如果需要跨域支持 Cookie,则
allowCredentials(true)
必须与特定的allowedOrigins
搭配使用,不能使用通配符。 - OPTIONS 请求的处理:有时,预检请求(OPTIONS 请求)可能会导致某些服务出现性能问题,可以通过 Spring Security 或 自定义过滤器 来优化。
七、跨域配置示例的对比分析表
配置项 | 作用 | 示例 |
---|---|---|
allowedOrigins |
允许的来源地址 | "http://example.com" |
allowedMethods |
允许的 HTTP 方法 | "GET", "POST", "PUT", "DELETE" |
allowedHeaders |
允许的请求头 | "Origin", "Content-Type", "Authorization" |
allowCredentials |
是否允许 Cookie 的发送 | true |
? 重要提示:在生产环境中,请务必对跨域的配置进行严格控制,以防止出现安全漏洞。
八、实现跨域配置的其他方法
除了使用 WebMvcConfigurer
的方式,Spring Boot 还提供了其他实现跨域配置的方法,例如:
1. 使用 @CrossOrigin
注解
可以在具体的 Controller 或方法上使用 @CrossOrigin
注解,来单独处理某个接口的跨域请求:
@RestController
@CrossOrigin(origins = "http://example.com")
public class ExampleController {
@GetMapping("/data")
public String getData() {
return "Hello, World!";
}
}
? 适用场景:
当只需要为特定接口开放跨域时,使用 @CrossOrigin
注解非常简便。
2. 使用 Filter
实现跨域配置
通过编写自定义的 过滤器 来实现跨域支持:
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
Hadoop常用命令。
hutool Http 工具发送POST请求的几种方式