我将项目中的spring框架从3.1升级到4.2,我遇到了问题, 升级之前的跨域配置在nginx内有效,然后升级到4.2跨域请求将返回“ 403 Invalid CORS request”。通过查看源,发现DefaultCorsProcessor将确定是否配置了corsconfiguration,如果未配置corsconfiguration和一个预请求,它将返回403。
@Override
public boolean processRequest(CorsConfiguration config, HttpServletRequest request, HttpServletResponse response)
throws IOException {
if (!CorsUtils.isCorsRequest(request)) {
return true;
}
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse(response);
ServletServerHttpRequest serverRequest = new ServletServerHttpRequest(request);
if (WebUtils.isSameOrigin(serverRequest)) {
logger.debug("Skip CORS processing, request is a same-origin one");
return true;
}
if (responseHasCors(serverResponse)) {
logger.debug("Skip CORS processing, response already contains \"Access-Control-Allow-Origin\" header");
return true;
}
boolean preFlightRequest = CorsUtils.isPreFlightRequest(request);
if (config == null) {
if (preFlightRequest) {
rejectRequest(serverResponse);
return false;
}
else {
return true;
}
}
return handleInternal(serverRequest, serverResponse, config, preFlightRequest);
}
所以我将以下配置添加到WebMvcConfigurerAdapter。
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*");
}
让我感到困惑的是,跨域请求的请求在捕获过程中被200返回,但是第二个请求丢失了。 以下是通过Fiddler以及在通过DefaultCorsProcessor处理后获取正常请求的请求。 enter image description here
所以我想问一个问题,为什么浏览器不发送第二个请求,因为浏览器发送的预请求已成功返回200。