web端非同源接口请求,post application/json请求时,浏览器会发起一条options跨域预检查询。每次请求都发起一次options请求。如何解决每次api请求都会产生一条options请求呢?
发送options请求示例如下图:
Access-Control-Max-Age 大家可以查询一下这个报文的返回头;主要是告诉浏览器options请求有效期(单位秒),在有效期内,浏览器不会重复发送options请求。
解决该问题,就可以在服务端options请求过来询问是否能跨域请求时,返回请求头Access-Control-Max-Age的有效期设置
corsConfiguration.setMaxAge(3600L);
服务端代码示例
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 跨域配置
*
* @return
*/
@Bean
@ConditionalOnProperty("plat-config.isCorsFilterEnabled")
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 1允许任何域名使用
corsConfiguration.addAllowedOrigin("*");
// 2允许任何头
corsConfiguration.addAllowedHeader("*");
// 3允许任何方法(post、get等)
corsConfiguration.addAllowedMethod("GET");
corsConfiguration.addAllowedMethod("POST");
// 允许跨域查询请求响应头中添加Access-Control-Max-Age: 3600(单位秒)
// 表明该响应的有效时间为 3600 秒。在有效时间内,浏览器无须为同一请求再次发起预检请求
corsConfiguration.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration);
log.warn(">>>>>>>>>>>>>>> 跨域配置开启 >>>>>>>>>>");
return new CorsFilter(source);
}