ColdFusion不处理对CFC的HTTP OPTIONS请求

时间:2013-04-19 14:47:07

标签: ajax extjs coldfusion

情景:

  • 一个托管基于ExtJS的前端应用程序的网络服务器。
  • 承载后端服务的ColdFusion 10服务器(使用Apache)。
  • 前端应用程序向表单http://<CF_server>/<app_path>/<CFC>?method=someMethod&...
  • 的ColdFusion组件(CFC)发出AJAX请求
  • 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(orRequestStart,...)上触发事件方法,返回filecontent和headers。
  • 使用OPTIONS方法向CFC发出的HTTP请求不会触发事件,也不会返回文件内容或标题。
  • 对未成员CFC的调用(使用OPTSIONS方法)返回相同的结果。

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

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

这与没有回复的此帖子类似:http://www.houseoffusion.com/groups/cf-talk/thread.cfm/threadid:59715

感谢。

1 个答案:

答案 0 :(得分: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调用时存在许多差异。我不记得具体细节,但如果这是最终的要求,请测试早期的跨浏览器。