从html页面提供javascript文件

时间:2017-05-18 16:37:32

标签: javascript http https coldfusion

我有来自第三方供应商的资源,仅通过http协议提供服务。当我包含这样的脚本标签时......

<script src="http://example.com"></script>

我得到一个带有JSON数据的javascript变量,与此类似......

var data = {"total": "10", "results": [{"name": "Joe", "title": "developer"}, {"name": "Jane", "title": "engineer"}]};

然后,我可以在页面中使用变量data来输出结果等。

问题是,我需要通过SSL(https)在页面上提供此数据,而我无法通过httphttps页面发出资源请求 - 这意味着{ {1}}包含不起作用。

作为一个解决方案,我从服务器页面请求资源,比如说<script/>,然后从我的服务器通过data.cfm重新提供JS变量。所以,在这种情况下,我希望httpshttps://anotherserver.com/data.cfm

提供相同的JS服务
http://example.com

我还应该注意,JSON数据中包含HTML标记。

当我尝试转到<cfhttp result="myData" method="GET" charset="utf-8" url="http://example.com"> <cfoutput><pre>#myData.fileContent#</pre></cfoutput> 时,我获取了数据,但格式不正确。例如,超链接作为超链接处于活动状态。

我也尝试使用https://anotherserver.com/data.cfm将数据作为无格式字符串返回,但是当我使用<cfdump>标记时,我没有得到JS变量。

更新

通过进一步测试,我发现如果我只是将数据作为文本复制到2个文件中:data.cfm和data.js,js文件按预期工作,cfm文件不工作。这让我相信文件扩展名导致资源被读取为html。所以,这更像是一个Coldfusion问题。如何通过浏览器将cfm文件设置为javascript?是否有一些响应头或元数据字段可以实现此目的?

2 个答案:

答案 0 :(得分:1)

我可能会为此投反对票。正确的做法是告诉该服务在其服务器上启用https。不接受使用https的面向公众的基于Web的服务是不可接受的。

答案 1 :(得分:0)

首先,如果您在浏览器中查看js和cfm文件,那么js将基本上显示为文本输出,cfm将被解释为html。这是由于Web服务器自动返回的mime类型或浏览器进行的猜测。这就是cfm方法看起来不同的原因。但是,如果您使用脚本标记提取网址,则会假定它是javascript。如果您在cfm页面上执行源代码视图,它应该看起来很好。

其次,我们需要更多信息来准确诊断导致您遇到的问题的原因,其中包含js文件与托管相同信息的cfm文件导致后者出错。我最初的猜测是,这里发生的事情比我们在你的问题中看到的要多,并且存在一个javascript转义问题。 (编辑:实际上我看到一些js代码可能会根据内容类型做出决定,所以返回可能会有所不同,具体取决于使用方式)

最后,如果将cfm文件的确切输出保存到js文件,则应设置。通过脚本标签从cfm文件中提取javascript应该没有问题。但是,为了避免任何潜在的问题,并添加一些缓存,您可以保存到静态文件。缓存将允许文件在一段时间内只被拉一次(例如:每分钟一次)。在您的普通代码中,您可以添加此...

<cfif not structKeyExists(application, "jsfilename_cachesaved") or application.jsfilename_cachesaved lt dateAdd("n", -1, now())>
    <cflock name="jsfileupdate" timeout="5">
        <cfif not structKeyExists(application, "jsfilename_cachesaved") or application.jsfilename_cachesaved lt dateAdd("n", -1, now())>
            <cfhttp result="myData" method="GET" charset="utf-8" url="http://example.com">
            <cffile action="write" file="#jsfilepath#" output="myData.fileContent" />
            <cfset application.jsfilename_cachesaved = now() />
        </cfif>
    </cflock>
</cfif>

(双if语句用于避免不必要的锁定以及同时锁定用户的不必要的保存)