Spring Boot解决CORS跨域问题

Spring Boot跨域大约 2728 字

前后端协调

与前端调试接口时,遇到跨域问题,一般两种解决方式:

  • 前端代理请求(Nginx代理webpack代理等)
  • 后端处理响应并解决跨域问题

@CrossOrigin

相关属性

@CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.POST, RequestMethod.OPTIONS})

全局配置

@CrossOrigin
@SpringBootApplication
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

单个配置

@CrossOrigin
@PostMapping("/test")
public String test() {
    return "ok";
}

Filter

使用javax.servlet包下的过滤器

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Headers", "*");
        filterChain.doFilter(servletRequest, servletResponse);
    }

}

WebMvcConfigurer

使用springframework.web.servlet包下的控制器配置

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }

}

CorsFilter

使用springframework.web.filter包下的跨域过滤器

@Configuration
public class CorsConfig {

    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        //以下三个配置必须要有
        corsConfiguration.addAllowedOrigin("*"); // 1. 允许任何域名使用
        corsConfiguration.addAllowedHeader("*"); // 2. 允许任何头
        corsConfiguration.addAllowedMethod("*"); // 3. 允许任何方法(post、get等)
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig()); // 4. 配置适用于/**下的路径
        return new CorsFilter(source);
    }

}

Spring Security

Spring Security跨域需要两步,且第二步必须配置WebMvcConfigurer。设置@CrossOrigin无效。

第一步:配置Spring Security支持跨域。

@Override
protected void configure(HttpSecurity http) throws Exception {
        http.cors();
}

第二步:配置WebMvcConfigurer支持工程跨域。

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }

}

推荐使用

没有Spring Security框架下推荐使用@CrossOrigin

前端解决可参考

阅读 621 · 发布于 2020-02-16

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看换一批