场景:
- 托管基于 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/