之前的项目都没有跨域的要求,都是通过nginx反代后端接口避免跨域请求的,但是最近的项目要求要处理跨域的请求,所以记录一下

1. 正常的Spring boot项目

基本的spring boot项目只需要写个配置类,实现WebMvcConfigurer接口的addCorsMappings方法

1
2
3
4
5
6
7
8
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowCredentials(true)
            .allowedHeaders("*")
            .allowedOrigins("*")
            .allowedMethods("*");
}

这样就会给所有路由的请求加上跨域所需的headers

2. Spring Boot + Shiro

Spring Boot整合Shiro之后,默认所有请求会先经过shiro的监听器,所以上面的全局方法已经不管用了。(怎么整合shiro就不说了)

这时候就得祭出第二招,cors监听器。实现一个监听器,放在shiro的监听器之前,这样就可以保证在所有请求到来的时候,都会给response加上跨域headers。

 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
@Bean
public FilterRegistrationBean corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    // 允许cookies跨域
    config.setAllowCredentials(true);
    // #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
    config.addAllowedOrigin("*");
    // #允许访问的头信息,*表示全部
    config.addAllowedHeader("*");
    // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
    config.setMaxAge(18000L);
    // 允许提交请求的方法,*表示全部允许
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("HEAD");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");
    config.addAllowedMethod("PATCH");
    source.registerCorsConfiguration("/**", config);

    FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
    // 设置监听器的优先级
    bean.setOrder(0);

    return bean;
}

3. 小结

跨域的设置其实很简单,原理就是给response加上跨域的header就完事了