ajax - ColdFusion 不处理 CFC 的 HTTP OPTIONS 请求

标签 ajax extjs coldfusion

场景:

  • 托管基于 ExtJS 的前端应用程序的网络服务器。
  • 托管后端服务的 ColdFusion 10 服务器(带有 Apache)。
  • 前端应用程序向 ColdFusion 组件 (CFC) 发出 AJAX 请求,格式为 http://<CF_server>/<app_path>/<CFC>?method=someMethod&...
  • CFC 使用 JSON 进行响应。

由于前端和后端位于不同的服务器上,我们处于 CORS(跨源资源共享)环境中,并且 AJAX 请求向后端发出两个 http 请求:第一个是用于握手的 OPTIONS 方法,第二个是 POST 请求。我需要在 CF 服务器上的 Apache 中启用 header ,并使用“ header 设置 Access-Control-Allow-Origin: *”指令来启用 CORS,但我希望以编程方式从 CF 而不是 Apache 处理 header 。我运行了一些测试,发现 http 请求中的 OPTIONS 方法仅适用于 CFM 而不适用于 CFC,因此第一个 AJAX 请求(使用 OPTIONS 方法)失败。我可以绕过 AJAX 调用设置 useDefaultXhrHeader 属性中的 OPTIONS 请求,但我会理解 CF 行为。

使用 cfhttp 标签运行测试后,我发现:

  • 使用 OPTIONS 方法向 CFM 发出的 HTTP 请求与 GET 方法类似:触发 Application.cfc 上的事件方法(或RequestStart,...),返回文件内容和 header 。
  • 使用 OPTIONS 方法向 CFC 发出的 HTTP 请求不会触发事件,不会返回文件内容或 header 。
  • 对不存在的 CFC 的调用(使用 OPTSIONS 方法)会返回相同的结果。

为什么CF在调用CFC时不处理OPTIONS方法?

在我的测试中,我使用端口 8500 上的集成 CF Web 服务器绕过了 Apache。我也在 CF9 上尝试过,结果相同。相反,Railo 有不同的行为:也为 CFC 处理 OPTIONS 方法。

这与没有响应的线程类似:http://www.houseoffusion.com/groups/cf-talk/thread.cfm/threadid:59715

谢谢。

最佳答案

我最近在使用 CF 和 Apache CXF 时都遇到了同样的问题。

似乎 CF 对于 GET 和 POST 之外的动词没有定义的行为。就我而言,我在此处安装了 CORS 过滤器:http://software.dzhuvinov.com/cors-filter-installation.html

它会拦截请求并在请求到达您的应用程序之前对其进行处理。它适用于 CXF 并且应该适用于 CF,但缺点是它需要更改您的 web.xml,这在某些托管设置中可能是不允许的。

另一个选项是配置 apache 添加必要的 header : http://enable-cors.org/server_apache.html

我还发现浏览器供应商在使用 OPTIONS 调用时存在许多差异。我不记得具体细节,但如果这是最终要求,请测试早期的跨浏览器。

关于ajax - ColdFusion 不处理 CFC 的 HTTP OPTIONS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107340/

相关文章:

javascript - ajax调用后如何修复javascript?

extjs - 如何使用xtype filefield(extjs 4.1.0)限制文件类型?

unit-testing - ExtJS 检查元素是否可见

database - 如何在集群环境中管理 cfc 的状态

loops - ColdFusion 在同一代码中循环到看似不同的时间

javascript - 将 JavaScript 变量传递给 PHP 并将 PHP 结果返回给 JavaScript 变量

javascript - Laravel Blade 在 php 中传递 Javascript 变量

javascript - 对数据库的 AJAX 请求 - 下载 .csv 文件

extjs - ExtJs 的未定义 Ext

php - ColdFusion 相当于 PHP openssl_sign()