怎么利用Scheduled定时器,让跨域定时加载最新的白名单数据呢?或者给个其他方案,谢谢各位
@Configuration
@EnableScheduling//启动定时
public class CorsConfig {
@Autowired
CorsRepository corsRepository;
Integer corsI = 1;
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
List<Cors> corsa = corsRepository.findAllByCorsType(true);
for (int i = 0; i < corsa.size(); i++) {
corsConfiguration.addAllowedOrigin(corsa.get(i).getIpAddress());// 1 设置访问源地址
}
// corsConfiguration.addAllowedOrigin("http://192.168.1.5");// 1 设置访问源地址
// corsConfiguration.addAllowedOrigin("http://192.168.31.109");// 1 设置访问源地址
// corsConfiguration.addAllowedOrigin("http://192.168.31.110");// 1 设置访问源地址
// corsConfiguration.addAllowedOrigin("http://192.168.31.201");// 1 设置访问源地址
// corsConfiguration.addAllowedOrigin("http://localhost");// 1 设置访问源地址
corsConfiguration.addAllowedHeader("*");// 2 设置访问源请求头
corsConfiguration.addAllowedMethod("*");// 3 设置访问源请求方法
corsConfiguration.setAllowCredentials(true);
return corsConfiguration;
}
@Bean
// @Scheduled(initialDelay = 1000, fixedDelay = 6000 * 5)
public CorsFilter corsFilter() {
// System.err.println("跨域执行第" + corsI + "次");
corsI++;
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", this.buildConfig());// 4 对接口配置跨域设置
return new CorsFilter(source);
}
}
Cors 全部放开,将白名单Ip加载到内存中,白名单数据变动时同时刷新内存,以aop或Intercetor的方式去处理是否有权限访问,仅供参考!
或 Filter 的方式
@Bean
public FilterRegistrationBean corsFilter()
{
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://localhost:9000");
config.addAllowedOrigin("null");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
在你的定时器里面动态设置跨域白名单,创建一个传统的filter在里面获取到白名单路径对response设置允许跨域,别忘了把你原来设置的允许跨域删除掉