跨域脚本 ColdFusion 问题
Posted
技术标签:
【中文标题】跨域脚本 ColdFusion 问题【英文标题】:Cross-domain scripting ColdFusion issue 【发布时间】:2012-08-18 08:37:06 【问题描述】:我有一个愚蠢的问题,但我是新手。我正在尝试使用 extjs4 库发出跨域请求(通过 ajax)。作为服务器端语言,我使用的是 ColdFusion。到目前为止,我编写的整个代码都在同一个域上工作。我需要将静态文件(javascript、css 和 html)放在 Apache 服务器上,将动态内容(cfm、CFC)放在 Tomcat(openbd)上。因此前端脚本(主要在 Apache->javascript 上)在 Tomcat 上发出请求以获取内容。这绝对是跨域请求。
我用于提取数据 (CFC) 的代码块是:
<cfcomponent output="false">
<cfprocessingdirective pageencoding="utf-8">
<cfset setEncoding("URL", "utf-8")>
<cffunction name="getContent" access="remote" returnFormat="JSON" output="false" >
<cfargument name="start" default="0"/>
<cfargument name="limit" default="1000"/>
<cfargument name="id" default="0" required="false" type="numeric">
<cfargument name="model" default="" required="false" type="any">
<cfset var arrNomoi = ArrayNew(1)>
<cfset var stcReturn = "">
<!--- When going back to base state, ExtJS will make the function call with start set to 0. If this is the case
we set it to 1 --->
<cfset Arguments.start = Arguments.start + 1>
<cfif arguments.model EQ 'n_2664_1998'>
<cfquery name="getNomoi" datasource="ktimatologio">
SELECT CONCAT_WS('_',id,model) AS id, id AS 'id1', CONCAT_WS(' ',title,fek,date) AS 'title', description, body, model
FROM n_2664_1998
WHERE id = #arguments.id#
ORDER BY id ASC
</cfquery>
<cfelseif arguments.model EQ 'n_2308_1995'>
<cfquery name="getNomoi" datasource="ktimatologio">
SELECT CONCAT_WS('_',id,model) AS id, id AS 'id1', CONCAT_WS(' ',title,fek,date) AS 'title', description, body, model
FROM n_2308_1995
WHERE id = #arguments.id#
ORDER BY id ASC
</cfquery>
<cfelseif arguments.model EQ 'n_3889_2010'>
<cfquery name="getNomoi" datasource="ktimatologio">
SELECT CONCAT_WS('_',id,model) AS id, id AS 'id1', CONCAT_WS(' ',title,fek,date) AS 'title', description, body, model
FROM n_3889_2010
WHERE id = #arguments.id#
ORDER BY id ASC
</cfquery>
</cfif>
<cfset arrNomoi = convertQueryToExtJS(getNomoi,Arguments.start,Arguments.limit)>
<cfset stcReturn = "data"=arrNomoi,dataset=#getNomoi.RecordCount#>
<cfreturn stcReturn>
</cffunction>
<cffunction name="convertQueryToExtJS" access="public" hint="Convert Query to JSON usable by ExtJS Grid" returntype="array">
<cfargument name="qryData" type="query" required="true" hint="Query to convert">
<cfargument name="intStart" type="numeric" required="true" hint="Start of Result Set">
<cfargument name="intLimit" type="numeric" required="true" hint="How many records to return">
<!--- For the Array --->
<cfset var i = 1>
<cfset var end = ((Arguments.intStart) + arguments.intLimit)-1>
<cfset var arrNomoi = ArrayNew(1)>
<cfloop query="qryData" startrow="#Arguments.intStart#" endrow="#end#">
<cfset stcNomoi = StructNew()>
<cfset stcNomoi['id'] = #qryData.id#>
<cfset stcNomoi['id1'] = #qryData.id1#>
<cfset stcNomoi['title'] = #qryData.title#>
<!---<cfset stcNomoi['fek'] = #qryData.fek#>
<cfset stcNomoi['date'] = #qryData.date#>--->
<cfset stcNomoi['description'] = #qryData.description#>
<cfset stcNomoi['body'] = #qryData.body#>
<cfset stcNomoi['model'] = #qryData.model#>
<cfset arrNomoi[i] = stcNomoi>
<cfset i = i + 1>
</cfloop>
<cfreturn arrNomoi>
</cffunction>
</cfcomponent>
问题是:如何将上述函数包装成一个变量(名为“回调”)并发布到客户端?
我在 PHP 上看到过类似的代码块,但我不明白。下面是 PHP 代码块:
<?php
$callback = $_REQUEST['callback'];
// Create the output object.
$output = array('id' => 1, 'url' => 'loianegroner.com');
//start output
if ($callback)
header('Content-Type: text/javascript');
echo $callback . '([' . json_encode($output) . ']);';
else
header('Content-Type: application/x-json');
echo json_encode($output);
?>
尊敬的,
汤姆
希腊
【问题讨论】:
这会有帮助吗?这是一个如何在 ColdFusion 中构建 JSON/P 服务的示例 - raymondcamden.com/index.cfm/2009/3/11/… 感谢您的回复,很荣幸收到您的回复。现在的问题,我已经修改了你的例子,但我没有运气。我不知道出了什么问题。我试图在本地发展。所以,我在同一台机器上的 Apache 服务器在端口 80 上,Tomcat 在端口 8090 上。从 Tomcat 我主要提供动态 cfc(使用 openbd),从 Apache 我提供静态(Extjs 库)。我不是 pri 我没有将 Tomcat 代理到 Apache。我刚刚将我的脚本分为静态(将它们放在 Apache 上)和动态(将它们放在 Tomcat 上) 我需要更多关于它为什么不起作用的详细信息。您还希望确保 CFC 的“简单”请求远程工作。因此,如果您的 CFC 位于 localhost:8090/something.cfc,您可以将浏览器打开至localhost:8090/something.cfc?method=getcontent。它应该输出数据。 你说当你从 Apache 调用它时你什么也得不到。您是否在浏览器中使用 Firebug 或 Chrome 开发工具确认这一点? 【参考方案1】:看看这两个文件:
index.cfm 是您提交 AJAX 请求的处理程序,它将返回 JSON 结果
http://websvn.openbd.org/websvn/filedetails.php?repname=OpenBD&path=%2Ftrunk%2Fwebapp%2Fmanual%2Fapi%2Findex.cfm
index.cfm 与此 CFC 交互以获取信息并返回结果。
http://websvn.openbd.org/websvn/filedetails.php?repname=OpenBD&path=%2Ftrunk%2Fwebapp%2Fmanual%2Fapi%2Findex.cfc
当我编写这个 API 包装器时,我遇到了 returnFormat=JSON 的问题
【讨论】:
以上是关于跨域脚本 ColdFusion 问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 jquery 脚本中输出 Coldfusion 变量?
简单的 ColdFusion 脚本在 IE 中有效,但在 Firefox 中无效?
为什么不能在Coldfusion中顺序调用同一组件的两个方法?