在用 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)) { 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; } }
|