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最大