學習AJAX其實有個很重要的應用,就是為了執行另外幾個站點的ASP,返回結果。
真正用起來,發現2個問題,一向做DELPHI,接觸ASP不多的我,的確問題大堆。
第一個問題:
VBS的變量傳遞給JS。。。通過學習發現很簡單的。。。
先看下我大體實現方法:
<% dim sSrv1Link sSrv1Link = "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, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=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 頭的方法來判斷哪些資源允許 Web 浏覽器訪問該域名下的信息。然而,對於那些 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了?