3

设想:

  • 托管基于 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 set Access-Control-Allow-Origin: *”指令来启用 CORS,但我想以编程方式从 CF 而不是 Apache 处理标头。我已经运行了一些测试,我注意到 http 请求中的 OPTIONS 方法仅适用于 CFM 而不适用于 CFC,因此第一个 AJAX 请求(使用 OPTIONS 方法)失败。我可以在 AJAX 调用设置 useDefaultXhrHeader 属性中绕过 OPTIONS 请求,但我会理解 CF 行为。

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

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

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

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

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

谢谢。

4

1 回答 1

0

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

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

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

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

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

于 2013-04-19T15:03:59.640 回答