1.指定能访问的客户端域名,后测试发现白名单未生效,非白名单的也能访问.
@Bean
@Conditional(CorsFilterCondition.class)
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
//是否允许请求带有验证信息
corsConfiguration.setAllowCredentials(true);
// 允许访问的客户端域名
corsConfiguration.addAllowedOriginPattern("http://localhost:3000");
// corsConfiguration.addAllowedOriginPattern("*");
// 允许服务端访问的客户端请求头
corsConfiguration.addAllowedHeader("*");
// 允许访问的方法名,GET POST等
corsConfiguration.addAllowedMethod("*");
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
2.那么问题就是指向了 Filter, 为什么配置没有生效?
在 DefaultCorsProcessor 的 processRequest 方法中发现
在判断 response(响应) 的 ACCESS_CONTROL_ALLOW_ORIGIN(访问-控制-允许-源) 是直接返回true,没有到匹配白名单的方法( handleInternal )中,
如图
3.那么就能确定之前的Filter中有给 response 的 ACCESS_CONTROL_ALLOW_ORIGIN赋值操作
那就断点查看Filter 中有哪些过滤器是在 CorsFilter 之前的,发现有个MagicCorsFilter
进一步查看源码
发现此处 Origin 为空则赋值 * 否则赋值 Origin
刚好给response(响应) 的 ACCESS_CONTROL_ALLOW_ORIGIN 赋值使其跳过了后的校验
解决
找到了问题那就好解决了,
方案1.提升CorsFilter的优先级别在MagicCorsFilter之前,
方案2.降低MagicCorsFilter的优先级别在CorsFilter之后
我采用的是方案1 如下代码
//优先级别提升带最高
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
@Value("${cors.origins:*}")
private String origins;
@Bean
public FilterRegistrationBean<CorsFilter> newCorsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildCorsConfig());
FilterRegistrationBean<CorsFilter> filterRegistrationBean = new FilterRegistrationBean<>(new CorsFilter(source));
//优先级别提升带最高
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegistrationBean;
}
private CorsConfiguration buildCorsConfig() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.addAllowedOriginPattern("白名单");
//其他配置自行添加
corsConfig.setAllowCredentials(true);
return corsConfig;
}
提升后
再次测试问题解决