Fw/1(Lucee) - Ajax Framework7 中的 CORS 策略请求失败

Fw/1(Lucee) - Ajax request failed by CORS policy in Framework7

为了在 FW/1 (4.2) (Lucee 5.2.9) 中取回 json 数据,我在 Framework7 中收到了以下 ajax 请求,但不幸的是我得到了错误由于 Chrome 浏览器的 CORS 政策。

app.request({
  url:"http://127.0.0.1:49820/index.cfm/user/login/",
  type:"POST",
  data:JSON.stringify({
    "username":username,
    "password":password
  }),
  crossDomain: true,
  xhrFields: { withCredentials: false },
  headers: {
   'Access-Control-Allow-Origin': '*',
   'Access-Control-Allow-Methods':'GET,HEAD,OPTIONS,POST,PUT',
   'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, Authorization',
   'Content-type': 'text/javascript; charset=utf-8',
  },
  dataType:"jsonp",
  success:function(result){
      console.log(result);
  }

 });

在我的 Fw/1 Application.cfc 中,我有以下设置:

variables.framework =   {
      preflightOptions = true,
      generateSES = true,
      routes= [
        { "$POST/user/login/" = "/main/get" }
        ] 
    };

并且在我的主控制器中获取操作我通过

获取json
rc.user_info = variables.userService.login(rc.dsn,rc.username,rc.password);
variables.fw.renderData( "json", rc.user_info);

很遗憾,我收到了以下消息

从源 'http://localhost' 访问 'http://127.0.0.1:49820/index.cfm/user/login/' 处的 XMLHttpRequest 已被 CORS 策略阻止:请求 header 字段 access-control-allow-origin 不允许 Access-Control-Allow-Headers 预检响应.

关于 request-header 信息,我收到以下信息,据我所知,还传递了参数:

有什么想法可以帮助我吗?

此致

您使用的 FW/1 是什么版本?我假设是最新的?

我对 Framework7 的 ajax 功能如何工作一无所知,但我会尝试设置 preflightOptions = true,如果您还没有,请在 [=14] 的 FW/1 框架设置中=] 看看是否可以解决您的问题。

查看 http://framework-one.github.io/documentation/4.3/developing-applications/#options-support

OPTIONS Support 部分

更新

由于 preFlightOptions 正在使用...

我的下一个建议是在 FW/1 的框架设置中设置允许的 header。您可以通过定义 optionsAccessControl.headers = "your, headers, here" 来做到这一点。这些都在我已经分享的 link 中提到了。

如果您愿意,可以将 optionsAccessControl 结构定义为一个整体,并设置其他键。

optionsAccessControl = {
  origin: "",
  headers: "",
  credentials: true/false,
  maxAge: 12345
}

更新 2

同样的问题 cross-posted to the FW/1 GitHub Repository 所以为了透明起见,我想在这里与可能遇到此问题的任何人分享解决方案...

Application.cfc 中,包括以下框架设置:

generateSES = true,
SESOmitIndex = true,
preflightOptions = true,
optionsAccessControl = {
    origin: "*",
    headers: "Origin, X-Requested-With, Content-Type, Accept, Authorization, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin"
}

在控制器方法中传递原点 header 和响应:

variables.fw.renderData( "json", rc.user_info).header( "Access-Control-Allow-Origin", "*" );

注意:出于安全原因,最好不要使用“*”,而只允许 calling/responding 域。 (示例:http://127.0.0.1:12345

CORS 的功能是阻止端点未明确允许的浏览器请求(这是请求 'origin')。在您的情况下,端点位于 http://127.0.0.1:49820/index.cfm/user/login/。不可能通过纯客户端代码告诉客户端(就像您通过在 ajax 请求的请求 header 中提交它们所做的那样)绕过它。这会破坏 CORS 功能并破坏 CORS 的设计目的。

实现 CORS 的正确方法是在 FW/1 框架的 index.cfm/user/login/ 端点将它们实现为服务器响应 headers,而不是 AJAX 请求。在 cfml 中,您通常通过使用 cfheader 标记设置它们来实现服务器响应 headers。以下是允许请求的一些典型示例。请验证 FW1 端点是否正在提交这些服务器 http 响应 headers(例如,通过使用 chrome 开发工具检查响应)。

假设您使用 URL http://mydomain1:8080 打开浏览器应用程序并且您的端点不同(domain/IP/protocol 或端口),例如在 http://mydomain2:49820/index.cfm/user/login/,然后您需要将这些服务器响应 header 添加到您提交 JSON 类似代码的端点代码中,如下所示:

<cfheader name="access-control-allow-origin" value="http://mydomain1:8080">
<cfheader name="access-control-allow-credentials" value="true">
<cfheader name="access-control-allow-headers" value="Content-Type">

有关更多信息,请参阅有关 CORS 的文档 here