springboot中多 filter 情况下跨域失效的问题

java web 中多 filter 的情况下,可能存在跨域失效的情况,问题的原因是,filter 是一个一个的执行链,类似于队列的方式,先进先出。跨域的配置,本质上也是添加一个 filter ,但是可能存在跨域的 filter 的是最后执行的,导致跨域失效。

举例: 一般访问的 token 验证,也可能是使用的 filter 的方式进行验证的,就有可能在加了 token 验证的方式过后,跨域的配置失效。

修改的方式如下:

主要实现代码如下:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Collections;

/**
 * @author sopp
 */
@Configuration
public class CorsConfig {
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        //1,允许任何来源
        corsConfiguration.setAllowedOriginPatterns(Collections.singletonList("*"));
        //2,允许任何请求头
        corsConfiguration.addAllowedHeader(CorsConfiguration.ALL);
        //3,允许任何方法
        corsConfiguration.addAllowedMethod(CorsConfiguration.ALL);
        //4,允许凭证
        corsConfiguration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfiguration);
        // 优先级最高
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }

}

说明: 主要重点是配置 FilterRegistrationBean<CorsFilter> 来设置当前 bean 的优先级。

优先级的排序规则为: 从 0 开始的数字,优先级依次递减,0最大

文章作者: sopp
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 个人主页
springboot java springboot
喜欢就支持一下吧