xmlHTTP技術資料

一、數據庫遠程管理技術

基於互聯網的廣域網現代應用中的一個重要環節是數據庫遠程監控。首先簡單回顧一下互聯網上的數據庫遠程管理技術的發展過程和方式:

早期通過編寫CGI-BIN程序模塊進行數據庫遠程管理。但CGI-BIN的運行速度慢,維護很不方便,現在已經基本被棄用。

這幾年使用組件對象模型(Component Object Model, COM)的應用非常多,效果也很好。但如果使用的是第三方服務器(筆者的網站就是建立在第三方的虛擬主機上),服務器方往往因爲保密或其它商業原因不允許用戶註冊自己的組件。

近年來由微軟公司推出的.NET平臺和SUN公司的J2EE平臺都是非常高檔的數據庫遠程管理與服務平臺。都能提供優質的多層(n-Tier)應用服務。
其中,.NET的簡單對象訪問協議(Simple Object Access Protocol, SOAP)使用超文本傳輸協議(Hypertext Transfer Protocol, HTTP)和擴展標記語言(Extensible Markup Language, XML)技術實現跨系統(例如Windows - Linux)的通訊服務方式已經廣爲開發商接受和使用。許多大型應用,例如企業資源計劃(Enterprise resource planning, ERP)等都建立在這樣的大型平臺之上。
但對於中小型應用,比如一個網站的建設和維護,這種大型應用平臺就顯得有些尾大不掉,開銷也過於龐大。

曾經在互聯網技術和Java技術方面一度落後的微軟公司在XML應用開發則走在了前頭。她的XML解析器(MSXML)中的XMLHTTP協議是一個非常方便實用的客戶/服務通訊管道。綜合運用XMLHTTP以及ActiveX數據對象(ActiveX Data Objects, ADO/ADOX)可以簡單方便地實現數據庫遠程管理。

本文介紹如何綜合運用XMLHTTP和ADO/ADOX進行遠程數據庫管理。

二、數據庫遠程管理體系

數據庫遠程管理的任務流程是:
1、客戶端向服務端發出數據庫結構和數據的查詢或修改指令。
2、服務端接受並執行有關指令並向客戶端返回結果。
3、客戶端接受並顯示服務端返回的指令執行結果。

實現數據庫遠程管理的二個主要關鍵環節是:
1、客戶端與服務端之間的指令上傳和結果下傳的數據通道,由XMLHTTP協議實現。
2、服務端前沿與數據庫之間的指令傳送和結果返回,由起着中間層作用的ADO/ADOX接口完成。
三、XMLHTTP的使用

顧名思義,XMLHTTP是個傳送XML格式數據的超文本傳輸協議。

實際上,XMLHTTP的數據傳輸過程更爲靈活一些:
它上傳的指令可以是XML格式數據,也可以是字符串,流,或者一個無符號整數數組。還可以是URL的參數。
它下達的結果可以是XML格式數據,也可以是字符串,流,或者一個無符號整數數組。
詳情可參閱文末鏈接。

客戶端調用XMLHTTP的過程很簡單,只有5個步驟:
1、創建XMLHTTP對象
2、打開與服務端的連接,同時定義指令發送方式,服務網頁(URL)和請求權限等。
    客戶端通過Open命令打開與服務端的服務網頁的連接。與普通HTTP指令傳送一樣,可以用"GET"方法或"POST"方法指向服務端的服務網頁。
3、發送指令。
4、等待並接收服務端返回的處理結果。
5、釋放XMLHTTP對象

XMLHTTP方法:
Open bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword
    bstrMethod:數據傳送方式,即GET或POST。
    bstrUrl:服務網頁的URL。
    varAsync:是否同步執行。缺省爲True,即同步執行,但只能在DOM中實施同步執行。
     應用中一般將其置爲False,即異步執行。
    bstrUser:用戶名,可省略。
    bstrPassword:用戶口令,可省略。

Send varBody
    varBody:指令集。可以是XML格式數據,也可以是字符串,流,或者一個無符號整數數組。也可以省略,讓指令通過Open方法的URL參數代入。
    
setRequestHeader bstrHeader, bstrValue
    bstrHeader:HTTP 頭(header)
    bstrValue:HTTP 頭(header)的值
    如果Open方法定義爲POST,可以定義表單方式上傳:
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    
XMLHTTP屬性:
onreadystatechange:在同步執行方式下獲得返回結果的事件句柄。只能在DOM中調用。
responseBody:結果返回爲無符號整數數組。
responseStream:結果返回爲IStream流。
responseText :結果返回爲字符串。
responseXML:結果返回爲XML格式數據。
    

下面是本文附件源程序中的一個應用示例:
Function GetResult(urlStr)
    Dim xmlHttp
    Dim retStr
    
    Set xmlHttp = CreateObject("Msxml2.XMLHTTP")    '創建對象
    On Error Resume Next                    '出錯處理
    xmlHttp.Open "POST", urlStr, False        '用POST方式打開連接,異步執行。
    xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" '上傳表單
    xmlHttp.Send                            '發送指令

    If Err.Number = 0 Then                    '如果連接正確
        retStr = xmlHttp.responseText        '等待並獲得服務端返回的結果字符串
    Else
        retStr = "Url not found"                '否則返回出錯信息
    End If
    Set xmlHttp = nothing                    '釋放對象    GetResult = retStr                        '返回結果
End Function

GetResult()函數帶入一個服務網頁的URL參數,把上傳的指令安放在URL後面的參數上,如:
    urlStr = "server.asp?cmd=" & cmd & "&db=" & db & "table=" & table
    cmd:執行方式,例如查詢,修改,刪除等等。
    db:服務端數據庫名
    table:服務端表名
    
然後提交指令,等待並接收返回的處理結果。結果以字符串方式返回。

 

-------------------------------------------------------------------

XMLHTTP對象及其方法

MSXML中提供了Microsoft.XMLHTTP對象,能夠完成從數據包到Request對象的轉換以及發送任務。
創建XMLHTTP對象的語句如下:
Set objXML = CreateObject("Msxml2.XMLHTTP") 或
Set objXML = CreateObject(“Microsoft.XMLHTTP”)
' Or, for version 3.0 of XMLHTTP, use:
' Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")
對象創建後調用Open方法對Request對象進行初始化,語法格式爲:
poster.open http-method, url, async, userID, password
Open方法中包含了5個參數,前三個是必要的,後兩個是可選的(在服務器需要進行身份驗證時提供)。參數的含義如下所示:
http-method: HTTP的通信方式,比如GET或是 POST
url: 接收XML數據的服務器的URL地址。通常在URL中要指明 ASP或CGI程序
async: 一個布爾標識,說明請求是否爲異步的。如果是異步通信方式(true),客戶機就不等待服務器的響應;如果是同步方式(false),客戶機就要等到服務器返回消息後纔去執行其他操作
userID 用戶ID,用於服務器身份驗證
password 用戶密碼,用於服務器身份驗證
XMLHTTP對象的Send方法
用Open方法對Request對象進行初始化後,調用Send方法發送XML數據:
poster.send XML-data
Send方法的參數類型是Variant,可以是字符串、DOM樹或任意數據流。發送數據的方式分爲同步和異步兩種。在異步方式下,數據包一旦發送完畢,就結束Send進程,客戶機執行其他的操作;而在同步方式下,客戶機要等到服務器返回確認消息後才結束Send進程。
XMLHTTP對象中的readyState屬性能夠反映出服務器在處理請求時的進展狀況。客戶機的程序可以根據這個狀態信息設置相應的事件處理方法。屬性值及其含義如下表所示:
值 說明
0 Response對象已經創建,但XML文檔上載過程尚未結束
1 XML文檔已經裝載完畢
2 XML文檔已經裝載完畢,正在處理中
3 部分XML文檔已經解析
4 文檔已經解析完畢,客戶端可以接受返回消息
客戶機處理響應信息
客戶機接收到返回消息後,進行簡單的處理,基本上就完成了C/S之間的一個交互週期。客戶機接收響應是通過XMLHTTP對象的屬性實現的:
● responseTxt:將返回消息作爲文本字符串;
● responseXML:將返回消息視爲XML文檔,在服務器響應消息中含有XML數據時使用;
● responseStream:將返回消息視爲Stream對象。

 


下面的xml文件是動態生成的最後用xmlHTTP傳送出去,這是一個在客戶端JavaScript腳本里的內容,當然你也可以寫在服務器,但是要相應的改一些東西:(僅供大家參考,瞭解它的用法)
var xmlDoc=new ActiveXObject("MSXML2.DOMDocument");
flag=xmlDoc.loadXML("");

newNode =xmlDoc.createElement("編碼")
MarkNode=xmlDoc.documentElement.appendChild(newNode);
newNode =xmlDoc.createElement("StartMark")
newNode.text=StartMark;
MarkNode.appendChild(newNode)
newNode =xmlDoc.createElement("EndMark")
newNode.text=EndMark;
MarkNode.appendChild(newNode)

newNode =xmlDoc.createElement("日期")
DateNode=xmlDoc.documentElement.appendChild(newNode);
newNode =xmlDoc.createElement("StartDate");
newNode.text=StartDate;
DateNode.appendChild(newNode)
newNode =xmlDoc.createElement("EndDate")
newNode.text=EndDate;
DateNode.appendChild(newNode);

newNode =xmlDoc.createElement("數量")
SLNode =xmlDoc.documentElement.appendChild(newNode);
newNode =xmlDoc.createElement("StartSL")
newNode.text=StartShuL
SLNode.appendChild(newNode)
newNode =xmlDoc.createElement("EndSL");
newNode.text=EndShuL
SLNode.appendChild(newNode);

newNode =xmlDoc.createElement("單價")
DJNode =xmlDoc.documentElement.appendChild(newNode)
newNode =xmlDoc.createElement("StartDJ")
newNode.text=StartDanJ;
DJNode.appendChild(newNode);
newNode =xmlDoc.createElement("EndDJ")
newNode.text=EndDanJ;
DJNode.appendChild(newNode);

newNode =xmlDoc.createElement("金額")
JENode =xmlDoc.documentElement.appendChild(newNode)
newNode =xmlDoc.createElement("StartJE")
newNode.text=StartJinE
JENode.appendChild(newNode)
newNode =xmlDoc.createElement("EndJE")
newNode.text=EndJinE
JENode.appendChild(newNode)

newNode =xmlDoc.createElement("倉庫代碼")
newNode.text=CK;
xmlDoc.documentElement.appendChild(newNode)

newNode =xmlDoc.createElement("票號")
newNode.text=RKPH;
xmlDoc.documentElement.appendChild(newNode)

newNode =xmlDoc.createElement("單位代碼")
newNode.text=CorpName;
xmlDoc.documentElement.appendChild(newNode)

newNode =xmlDoc.createElement("BiaoShi")
newNode.text=Biaoshi
xmlDoc.documentElement.appendChild(newNode)

newNode =xmlDoc.createElement("FindCate")
newNode.text=FindCate
xmlDoc.documentElement.appendChild(newNode)

var xh =new ActiveXObject("MSXML2.XMLHTTP")
xh.open("POST","Find.asp",false)
xh.setRequestHeader("Content-Type","text/xml")
xh.setRequestHeader("Content-Type","gb2312")
xh.send(xmlDoc);
我的每一個newNode的text值是一個變量,也就是我客戶端form 中input的值

-------------------------------------------------------------------


ASP小偷程序如何利用XMLHTTP實現表單的提交
利用XMLHTTP來製作小偷的具體細節落伍很多人都發過和討論過了,但是在製作ASP小偷的過程中,很多人就發現ASP小偷不如PHP小偷的那麼強

大了。確實,如果在原網站如果存在表單提交或cookies的驗證,對於ASP來說,不使用基於SOCKET的組件就難以完成,其實,XMLHTTP的另外兩

個方法被我們忽略了,而這正是問題的關鍵。
下面首先來說說這個方法
1。.send()
由於流行的小偷是使用的GET而不是POST來傳送數據,所以很多人忽略了這個方法,而使用SEND發送數據也很簡單,就是SEND("內容"),可是,

發送表單就不是這麼簡單,因爲你發送的表單如果是中文的話,就要牽扯到編碼的問題了。
首先,你在OPEN 時要確定是用POST 即 .open("POST",地址,是否異步)
然後,在SEND裏面加上你表單的內容,比如說,你要提交的表單有3個表單域,分別是A,B,C,對應的值分別是1,2,3,那麼,你在SEND裏這

樣寫就可以提交表單了,.send("A=1&B=2&C=3"),怎麼樣,很簡單吧,是不是沒想到呢?但是別高興的太早了,我前面說到了,如果表單的值是

中文的話,數據傳輸的就會出錯了。這裏我們藉助一個函數escape(),熟悉JAVASCRIPT的朋友都應該知道這個函數的作用了,現在VBSCRIPT同樣支持這個函數。.send("A=escape('值1')&B=escape('值2')&C=escape('值3')")
2。.setRequestHeader()
接着上面的所說,你的數據send出去了,對方卻不會接收到,爲什麼了,其實,那是因爲你的HTTP頭少了一個東西,然後用這個函數把加上去就可以了,具體就是.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded"), 告訴對方你是提交了一個urlencode編碼的表單。

好的,說完了表單的提交來說怎麼傳送cookies和session


其實傳送cookies也很簡單了,同樣利用這個函數在HTTP頭裏添加東西,比如,我當前在落伍的cookies是
cdb_sid=ybBiK0; cdb_cookietime=315360000; cdb_oldtopics=D869008D; cdb_visitedfid=1D45; cdb_auth=AQYHXVFDGERdsggVQA1VYUgxQDwFVV1dUAlwFAFRXVwU%2FbAIJB1lUCg; cdb_fid45=1113370145
現在我要發送這個cookies就直接是.setRequestHeader("Cookie","cdb_sid=ybBiK0; cdb_cookietime=315360000; cdb_oldtopics=D869008D; cdb_visitedfid=1D45; cdb_auth=AQYHXVFDGERdsggVQA1VYUgxQDwFVV1dUAlwFAFRXVwU%2FbAIJB1lUCg; cdb_fid45=1113370145")
當然,有些網站頁面有頁面判斷功能,這個也不難,就是.setRequestHeader("Referer","來路的絕對地址")
這裏還有個重要問題,就是這個方法由於是寫HTTP頭的,所以不能更改現有的HTTP頭,對於怎麼用asp獲取對方頁面的cookies或session並且發出去.

Feedback

# 一個用來遠程登陸我們學校系網站的頁面   

2005-08-10 22:25 by WDDavid
不要拿來做壞事哦.直接運行就可以了,通過循環username和userpwd可以進行反覆嘗試式登陸.

Login.asp:

<META http-equiv="content-type" content="text/html; charset=gb2312">
<%
Function GetResult(urlStr)
Dim xmlHttp
Dim retStr

Set xmlHttp = CreateObject("Msxml2.XMLHTTP") '創建對象
On Error Resume Next '出錯處理
xmlHttp.Open "POST", urlStr, False '用POST方式打開連接,異步執行。
xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" '上傳表單
xmlHttp.Send "username=yourusername&userpwd=yourpassword&usercookies=0" '發送指令

If Err.Number = 0 Then '如果連接正確
retStr = xmlHttp.responseText '等待並獲得服務端返回的結果字符串
Else
retStr = "Url not found" '否則返回出錯信息
End If
Set xmlHttp = nothing '釋放對象 GetResult = retStr '返回結果
Response.Write retStr
End Function
GetResult "http://jsjx.hcvt.cn/bbs/deptbbs.asp?act=LoginChk"
%>
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章