在 Spring Boot 应用处理跨域问题

在用 Spring Boot 开发服务时,如果客户端是 H5 的应用,通常会遇到跨域问题。 在 Spring Boot 中,提供了多种方法来处理该问题。下面我们就简单的给大家介绍一下。

使用 @CrossOrigin 注解

破解跨域最简单的方法就是在 Controller 类中加入 @CrossOrigin, 代码如下:

1
2
3
4
5
6
7
8
9
10
@RestController
@RequestMapping("/")
@CrossOrigin
public class OkApi {

@GetMapping
public String ok() {
return "ok";
}
}

当然, @CrossOrigin 注解可以配置很多参数,具体可以参考官方文档,在这里就不一一赘述了。

使用 CorsRegistry

如果觉得上一种方法需要在每个 Controller 中加入注解比较麻烦,那也可以在配置类中加入一个应用级的跨域处理。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class AppConfig extends WebMvcConfigurationSupport {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}

}

该类必须继承自 WebMvcConfigurationSupport, 然后覆盖 addCorsMappings 方法,然后在方法中用代码对跨域的情况做具体的配置。

拦截器中的处理

如果在系统中使用了拦截器(注意: 不是Filter), 则需要在拦截器中对跨域做一些特别的处理,比如下面的代码,在 preHandle 中对跨域进行了处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Component
@CrossOrigin
public class MyInterceptor implements HandlerInterceptor {

private Logger log = LoggerFactory.getLogger(AuthInterceptor.class);

@Override
public boolean preHandle
(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {

String method = request.getMethod();

if ("OPTIONS".equals(method)) {//检测是options方法则直接返回200
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setStatus(HttpStatus.OK.value());
return false;
}

/*
*
* 你的拦截器逻辑写在这里
*
*/

return true;
}
}

本文标题:在 Spring Boot 应用处理跨域问题

文章作者:Morning Star

发布时间:2020年11月04日 - 20:11

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/java/springboot-handle-cross-origin/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。