SpringBoot整合SpringMVC之解决跨域问题

这篇文章将介绍使用SpringMVC解决跨域问题的三种实现方式,以及推荐一种最优的解决方案。


前言

应用场景:前后端分离之后,前端和后端api在不同的域名之下

实现方式:

  • 使用@CrossCors注解
  • 使用CorsRegistyr.java注册表
  • 使用CorsFilter.java过滤器(推荐)

前两种都存在与权限拦截器冲突导致的Cors跨域设置失效问题


实现

1.@CrossCors注解

@RestController
@RequestMapping("/test")
@CrossOrigin(origins = "*", allowCredentials = "true") //允许所有来源,允许发送 Cookie
public class TestController {

    @GetMapping("/get")
    @CrossOrigin(allowCredentials = "false") //允许所有来源,不允许发送 Cookie
    public UserVO get() {
        return new UserVO().setId(1).setUsername(UUID.randomUUID().toString());
    }
}

2.使用CorsRegistyr.java注册表

//cors
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //添加全局的 CORS 配置
        registry.addMapping("/**")  //匹配所有的 URL ,相当于全局配置
            .allowedOrigins("/**") //允许所有请求来源
            .allowCredentials(true) //允许Cookie
            .allowedMethods("*") //允许所有请求 Method
            .allowedHeaders("*") //允许所有请求 Header
            .maxAge(1800L); //有效期1800秒,两小时
    }

3.CorsFilter.java过滤器(推荐)

//跨域过滤器
    @Bean
    public FilterRegistrationBean corsFilter() {
        //创建 UrlBasedCorsConfigurationSource 配置源,类似 CorsRegistry 注册表
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        //创建 CorsConfiguration 配置,相当于 CorsRegistration 注册信息
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Collections.singletonList("*")); // 允许所有请求来源
        config.setAllowCredentials(true); // 允许发送 Cookie
        config.addAllowedMethod("*"); // 允许所有请求 Method
        config.setAllowedHeaders(Collections.singletonList("*")); // 允许所有请求 Header
//        config.setExposedHeaders(Collections.singletonList("*")); // 允许所有响应 Header
        config.setMaxAge(1800L); // 有效期 1800 秒,2 小时
        source.registerCorsConfiguration("/**", config);
        //创建 FilterRegistrationBean对象
        FilterRegistrationBean bean = new FilterRegistrationBean<>(new CorsFilter(source)); //创建CorsFilter过滤器
        bean.setOrder(0); //设置order排序
        return bean;
    }

谢谢观看

原文参考 http://www.iocoder.cn/Spring-Boot/SpringMVC/?self

你可能感兴趣的:(springboot)