我们将 ColdBox 用于我们的后端应用程序,并且遇到了 CORS 的奇怪问题。我们有一个 preProcess 函数作为 ajax 调用的拦截器,它是这样的:
函数预处理(事件,数据,缓冲区,rc,prc){
event.setHTTPHeader( name="Access-Control-Allow-Origin", value="http://localhost:3000" );
event.setHTTPHeader( name="Access-Control-Request-Headers", value="" );
event.setHTTPHeader( name="Access-Control-Request-Methods", value="GET,HEAD,POST" );
event.setHTTPHeader(name="Allow-Control-Allow-Credentials", value="true");
event.setHTTPHeader( name="Access-Control-Allow-Headers", value="*");
var uuid = CreateUUID();
var util = new com.smartvillage.api.util.ResponseUtil();
var validator = new com.smartvillage.core.util.JsonValidator.JsonValidator();
var model = server[ "wireBox-smartvillage" ];
event.setValue( "model", model );
event.setValue( "util", util );
event.setValue( "validator", validator );
event.setValue( "uuid", uuid );
var authSvc = model.getInstance( "AuthService" );
var ctx = arguments.event.getContext();
util.writeData( "#arguments.event.getContext().event#-#uuid#", SerializeJSON( data ) );
var ht = GetHTTPRequestData();
var data = {
"url" = url,
"form" = form,
"date" = now(),
"content" = ht.content,
"headers" = ht.headers,
"method" = ht.method
}
if (ctx.event NEQ "auth.login" ) {
var accessToken = event.getHTTPHeader("Authorization");
cffile(action="append", file=expandPath('/debug.log'), output="#now()#- #accessToken# -");
if (len(accessToken)) {
if ( !authSvc.isAuth( trim(accessToken.replace('Bearer', '')) ) ) {
event.renderData(data="Not Authorized",statusCode="401",statusText="Unauthorized")
.noExecution();
}
} else {
echo('Token not found');
abort;
}
};
};
如您所见,我们为本地主机(客户端正在运行的地方)设置了允许来源标头,但是发生的情况是,一些 ajax 调用成功,而另一些则因 Cors 问题而失败。下图显示了我们的网络。
如您所见,相同的调用随机失败或成功。它给我们的错误是:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
为什么会这样?
编辑:
我可以看到当有连续的 ajax 调用时会发生这种情况。