springSecurity跨域CORS处理

1,921 阅读2分钟

续言

之前 知识追寻者写过关于springboot 的跨域处理,并且介绍了跨域相关的概念;具体的可以查看这篇知识追寻者springboot教程系列文章

zszxz.com/category/sp…

关于跨域处理其实挺奇怪,spring, springboot, springSecurity 他们的跨域处理方式都不同!

spring的跨域处理

关于spring的跨域处理可以直接在类或者方法上使用 @CrossOrigin 达到目的;但这只能进行局部处理,如果需要全局处理则需要按如下方式进行配置

 
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
 
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
 
        registry.addMapping("/api/**")
            .allowedOrigins("https://zszxz.com")
            .allowedMethods("GET","POST","PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);
 
        // ...
    }
}

springboot 跨域处理

在springboot 中 一般情况下可以使用 springMvc的跨域方式配置,但是有时关于系统配置jdk等问题,会造成跨域失效,则需要按如下方式进行配置

@Configuration
public class WebConfig  {

    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("https://zszxz.com");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        //config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }

}

springSecurity跨域处理

在springSecurity中 配置方式和springboot 的配置区别方式不一样 ,则需要按如下方式进行配置。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // by default uses a Bean by the name of corsConfigurationSource
            .cors().and()
            ...
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://zszxz.com"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

官方示例中,以下这种配置,知识追寻者试过,没生效

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // if Spring MVC is on classpath and no CorsConfigurationSource is provided,
            // Spring Security will use CORS configuration provided to Spring MVC
            .cors().and()
            ...
    }
}

网上 说需要将 X-Frame-Options 头禁用调即可,当然我使用第一种方式就可以了,此方式不再尝试, 有兴趣的读者可以进行验证!

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 开启允许iframe 嵌套
        http.headers().frameOptions().disable();

        http.csrf().disable()
            // 开启跨域
            .cors().and()

            .....
    }

}

本套教程