下面是关于springboot跨域问题的解决方案完整攻略。
背景
在前后端分离的开发模式中,前端项目和后端项目通常会分别部署到不同的域名下,因此会出现跨域请求的问题。这时候就需要解决跨域问题。
解决方案
1. 添加跨域支持的Filter
Spring Boot提供了一种通过Filter来实现跨域请求的解决方案,步骤如下:
- 创建一个继承自
OncePerRequestFilter
的类,并重写其doFilterInternal
方法。
```java
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
response.setHeader("Access-Control-Allow-Origin", "*"); // 允许跨域请求的域名
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); // 允许跨域请求的方法
response.setHeader("Access-Control-Max-Age", "3600"); // 缓存时间(请求时间内不需要再次预请求)
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type"); // request headers信息
filterChain.doFilter(request, response);
}
}
```
- 在
src/main/resources/application.properties
中添加如下配置:
properties
# CORS
cors.allowed-origins=*
cors.allowed-methods=POST, GET, OPTIONS, DELETE
cors.max-age=3600
cors.allowed-headers=x-requested-with, Content-Type
如果你使用的是yaml格式的配置文件,则配置如下:
yaml
# CORS
cors:
allowed-origins: "*"
allowed-methods: "POST, GET, OPTIONS, DELETE"
max-age: 3600
allowed-headers: "x-requested-with, Content-Type"
- 重启Spring Boot应用程序。
2. 使用Spring Boot自带的CORS支持
Spring Boot还支持使用注解的方式来实现跨域请求,步骤如下:
- 在Controller类或者方法上添加
@CrossOrigin
注解。
```java
@RestController
@RequestMapping("/user")
public class UserController {
@CrossOrigin(origins = {"http://localhost:8080", "*"})
@GetMapping("/list")
public List<User> getUserList() {
// ...
}
}
```
@CrossOrigin
注解有控制跨域请求的源origin,方法和请求头等参数的功能。
origins
参数为必须参数,用于限制跨域请求的源,可以是字符串数组或者“*”,表示接受任何源。
- 重启Spring Boot应用程序。
示例
示例1:基于Filter的跨域请求解决方案
假设前端项目在http://localhost:8080
,后端项目在http://localhost:8888
,要使用JS的ajax方式请求后端数据,代码如下:
$.ajax({
url: 'http://localhost:8888/api/user/list',
method: 'GET',
dataType: 'json',
success: function(data) {
// ...
}
});
这时候就会出现跨域请求的问题。使用基于Filter的跨域请求解决方案,只需要按照上述步骤添加CorsFilter
类和配置文件即可解决问题。
示例2:基于注解的跨域请求解决方案
在示例1的基础上,我们可以使用@CrossOrigin
注解来解决跨域请求问题。代码如下:
@RestController
@RequestMapping("/api/user")
public class UserController {
@CrossOrigin(origins = {"http://localhost:8080", "*"})
@GetMapping("/list")
public List<User> getUserList() {
// ...
}
}
这样就可以处理来自http://localhost:8080
和任何其他源的跨域请求了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot跨域问题解决方案 - Python技术站