2017-05-18 79 views
0

我有一個來自僅通過http協議提供服務的第三方供應商的資源。當我包括腳本標籤這樣的...從html頁面提供javascript文件

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

我得到一個JavaScript變量與JSON數據,類似這樣的...

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

然後我就可以使用變量data在我頁面輸出結果等

的問題是,我要爲通過SSL(https)頁面上的這個數據,我不能爲https頁面進行資源請求通過http - 意爲<script/>包括不起作用。

作爲一個解決方案,我從服務器頁面請求資源,比如說data.cfm,然後通過我的服務器通過https重新提供JS變量。所以,在這種情況下,我想請求https://anotherserver.com/data.cfm服務於相同的JS爲http://example.com

<cfhttp result="myData" method="GET" charset="utf-8" url="http://example.com"> 
<cfoutput><pre>#myData.fileContent#</pre></cfoutput> 

我也應該注意到,JSON數據具有HTML標記它。

當我嘗試去https://anotherserver.com/data.cfm我收到數據,但它的格式不正確。例如,超鏈接作爲超鏈接處於活動狀態。

我也嘗試過使用<cfdump>,它將數據作爲未格式化的字符串返回,但是當我使用<script src="https://anotherserver.com/data.cfm"></script>標記時,我沒有得到JS變量。

更新

有了進一步的測試,我發現,如果我只將數據複製文本中2個文件:data.cfm和data.js JS文件按預期工作和CFM文件沒有。這導致我相信文件擴展名導致資源被讀爲html。所以,這實際上更多的是Coldfusion的問題。如何將瀏覽器的cfm文件設置爲javascript?是否有一些響應標題或元數據字段可以完成此操作?

+1

「我需要通過SSL(https)在頁面上提供此數據,並且我無法通過https爲https頁面提出資源請求」這部分對我來說沒有意義。通過HTTPS爲系統提供服務會如何防止您向通過HTTP提供服務的資源發送請求? – Ken

+0

@Ken http://stackoverflow.com/questions/28517391/allow-loading-http-resources-over-https –

+0

@VincentvanderWeele是的,如果你正在加載資源。他從腳本中加載返回一個json對象,然後使用這些數據。爲什麼不通過AJAX請求對象? – Ken

回答

0

首先,如果您在瀏覽器中查看js和cfm文件,那麼js將基本顯示爲文本輸出,而cfm將被解釋爲html。這是由於web服務器自動返回MIME類型或由瀏覽器猜測完成的。這就是cfm方法看起來不同的原因。但是,如果您使用腳本標記拉取網址,則會將其假定爲JavaScript。如果你在cfm頁面上做源代碼視圖,它應該看起來很好。

其次,我們需要更多的信息來確切地說明是什麼導致了您遇到的問題,其中包含js文件與承載相同信息的cfm文件在後者中導致錯誤。我最初的猜測是,在這裏發生的事情比我們在你的問題中看到的要多,並且存在一個JavaScript轉義問題。 (編輯:實際上,我看到一些js代碼可能會根據內容類型做出決定,因此返回的差異可能取決於使用的方式)

最後,如果將cfm文件的確切輸出保存到js文件那麼你應該設置。通過腳本標籤從cfm文件中提取javascript應該沒有問題。但是,爲了避免任何潛在的問題,並添加一些緩存,你可以保存到一個靜態文件。高速緩存將允許文件在一段時間內只能被拉一次(例如:每分鐘一次)。在正常的代碼(if語句是有,以避免不必要的點擊鎖定,也沒有必要節省了誰在同一時間擊中了用戶鎖雙)

1

你可以添加這個...

<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> 

我可能會因此而得到反對票。正確的事情發生在你告訴該服務在他們的服務器上啓用https。不使用https的面向公衆的基於Web的服務是不可接受的。

+0

當然是一個合理的建議 –

+0

我完全同意,並且我們提出了這樣的要求。我們正在嘗試創建一個解決方案解決方案,直到在供應商端解決問題。 – littlewolf