在现代 Web 开发中,跨域资源共享(CORS, Cross-Origin Resource Sharing)是一个常见的问题。特别是在前后端分离的架构中,前端通常运行在一个域名下,而后端可能部署在另一个域名或端口上,这就需要通过 CORS 来允许不同源之间的请求。
什么是跨域?
跨域指的是浏览器出于安全考虑,限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。简单来说,当一个请求的协议、域名或端口号不同时,就会被认为是跨域请求。
在 Spring Boot 中设置跨域
Spring Boot 提供了多种方式来处理跨域请求,下面介绍几种常见的实现方法:
方法一:全局配置 CORS
在 Spring Boot 中,可以通过 `WebMvcConfigurer` 接口来全局配置 CORS。这种方式适用于需要对整个应用进行统一的跨域配置。
```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) {
// 允许所有来源、所有 HTTP 方法和所有头部
registry.addMapping("/")
.allowedOrigins("") // 允许所有来源
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")// 允许的 HTTP 方法
.allowedHeaders("") // 允许所有头部
.allowCredentials(true);// 是否允许携带 Cookie
}
}
```
说明:
- `allowedOrigins("")` 表示允许所有来源访问,实际项目中建议替换为具体的域名。
- `allowedMethods` 指定允许的 HTTP 请求方法。
- `allowCredentials(true)` 表示是否支持携带 Cookie 等凭证信息。
方法二:使用注解实现局部跨域
如果只需要对某些特定接口开放跨域权限,可以使用 `@CrossOrigin` 注解。
```java
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@CrossOrigin(origins = "http://example.com", allowedHeaders = "")
public class MyController {
@GetMapping("/test")
public String test() {
return "Hello, CORS!";
}
}
```
优点:
- 局部配置更加灵活,适合针对单个接口或模块进行跨域控制。
方法三:自定义过滤器实现跨域
通过编写自定义的过滤器,可以在 HTTP 请求的早期阶段添加必要的 CORS 头部信息。
```java
import org.springframework.stereotype.Component;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 设置跨域头
response.setHeader("Access-Control-Allow-Origin", "");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "");
response.setHeader("Access-Control-Allow-Credentials", "true");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(request, response);
}
}
}
```
说明:
- 这种方式适合需要更细粒度控制的场景,比如动态修改允许的来源。
总结
Spring Boot 提供了多种方式来解决跨域问题,开发者可以根据项目需求选择合适的方案。无论是全局配置还是局部注解,都能有效应对跨域挑战。不过需要注意的是,在生产环境中应避免使用通配符 `` 配置跨域,以提高安全性并减少潜在风险。
希望本文对你有所帮助!如果你有其他问题,欢迎继续交流~