學習AJAX其實有個很重要的應用,就是為了執行另外幾個網站的ASP,返回結果。
真正用起來,發現2個問題,一向做DELPHI,接觸ASP不多的我,的確問題大堆。
第一個問題:
VBS的變數傳遞給JS。。。通過學習發現很簡單的。。。
先看下我大體實現方法:
<%dim sSrv1LinksSrv1Link = "http://www.XXX.org/test1.asp?U=TESTUSER&M=111&E=222"%><script type="text/javascript">function synSvrData(str){var xmlhttp;if (str.length==0){document.getElementById("txtHint").innerHTML="";return;}//建立對象if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safarixmlhttp=new XMLHttpRequest();}else{// code for IE6, IE5xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}//處理ONREADYSTATECHANGE事件,我們這裡只相應伺服器反饋成功的xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200){document.getElementById("txtHint").innerHTML=xmlhttp.responseText;}}xmlhttp.open("GET",str,true);xmlhttp.send();}</script>
上面這段代碼的意思就是用AJAX實現訪問一個ASP,並返回結果。
<script type="text/javascript">var jsSvr='<%=sSrv1Link%>'; synSvrData(jsSvr)</script>
看到沒?這個才是關鍵:
var jsSvr='<%=sSrv1Link%>';
js使用VBS變數,為什麼要這樣?因為加密串那些都是VBS產生的。
本地測試OK,現在把訪問檔案換成其他伺服器上的。。。
sSrv1Link = "http://www.XXX2.org/test1.asp?U=TESTUSER&M=111&E=222"
意思就是跨域!!!
這時候問題來了。。。代碼執行後無返回,後來發現不是不返回,是XXX2伺服器不響應!
發現問題出現在 test1.asp 這個檔案上!!!對!你沒看錯!
跨域請求,顧名思義,就是一個網站中的資源去訪問另外一個不同網域名稱網站上的資源。
以下兩端摘抄:
隨著 Web2.0 和 SNS 的興起,Web 應用程式對跨域訪問的需求也越來越多,但是,在指令碼中進行跨域請求是受安全性限制的,Web 開發人員迫切需要提供一種更安全、方便的跨域請求方式來融合(Mashup)自己的 Web 應用程式。這樣做的一個好處就是可以將請求分攤到不同的伺服器,減輕單個伺服器壓力以提高響應速度;另外一個好處是可以將不同的商務邏輯分布到不同的伺服器上以降低負載。
值得慶幸的是,跨域請求的標準已經出台,主流瀏覽器也已經實現了這一標準。W3C 工作群組中的 Web Applications Working Group(Web 應用程式工作群組)發布了一個 Cross-Origin Resource Sharing(跨域資源共用,該規範地址:http://www.w3.org/TR/access-control/和http://dev.w3.org/2006/waf/access-control/) 推薦規範來解決跨域請求的問題。該規範提供了一種更安全的跨域資料交換方法。具體規範的介紹可以訪問上面提供的網站地址。值得注意的是:該規範只能應用在類似 XMLHttprequest 這樣的 API 容器內。IE8、Firefox 3.5 及其以後的版本、Chrome瀏覽器、Safari 4 等已經實現了 Cross-Origin Resource Sharing 規範,已經可以進行跨域請求了。Cross-Origin Resource Sharing 的工作方式是通過添加 HTTP 頭的方法來判斷哪些資源允許 網頁瀏覽器訪問該網域名稱下的資訊。然而,對於那些 HTTP 要求導致使用者資料產生副作用的要求方法(特別是對於除了GET、某些 MIME 類型的 POST 之外的 HTTP方法),該規範要求瀏覽器對請求進行“預先驗”,通過發送 HTTP 的 OPTIONS 要求標頭詢問伺服器有哪些支援的方法,在徵得伺服器的同意後,再使用實際的 HTTP 要求方法發送實際的請求。伺服器也可以通知用戶端是否需要將驗證資訊(如 Cookie 和 HTTP Authentication 資料)隨同請求一起發送。
看了這麼多,其實實現一句話:就是添加HTTP頭!
先看看我們做測試用的原來的 test1.asp
<%sUser=request.QueryString("U") response.write("XXX.org: " & sUser)%>
下面添加跨域訪問:
<%response.AddHeader "Access-Control-Allow-Origin", "http://www.XXX2.org"sUser=request.QueryString("U") response.write("XXX2.org: " & sUser)%>
response.AddHeader "Access-Control-Allow-Origin", "http://www.XXX2.org"對了,就這麼一句話,跨域完成了,你再測試下,是不是OK了?