資源描述:
《用有窮自動機(jī)解析Cookie.doc》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、用有窮自動機(jī)解析Cookie以前我們開發(fā)一個代理轉(zhuǎn)換服務(wù)器,它位于移動設(shè)備(或者移動設(shè)備網(wǎng)關(guān),?如WAP網(wǎng)關(guān))與WEB服務(wù)器之間,移動設(shè)備通過我們的代理轉(zhuǎn)換服務(wù)器去訪問WEB服務(wù)器,代理轉(zhuǎn)換服務(wù)器會把取到的網(wǎng)頁(HTML)轉(zhuǎn)換成移動設(shè)備支持的網(wǎng)頁(如XHTML/CHTML/HDML/WML等),然后發(fā)給設(shè)備。這樣,移動設(shè)備就可以訪問現(xiàn)有的WEB服務(wù)了。后來,客戶要求加一個功能:大多數(shù)網(wǎng)站都要求瀏覽器支持Cookie,但很多移動設(shè)備的瀏覽器沒有這個功能,因為這個原因,設(shè)備訪問不了這些網(wǎng)站。客戶要求代理轉(zhuǎn)換服務(wù)器能夠解決這個問題
2、。在代理轉(zhuǎn)換服務(wù)器解中解決這個問題并不困難,可以這樣實(shí)現(xiàn):當(dāng)設(shè)備通過代理轉(zhuǎn)換服務(wù)器訪問WEB服務(wù)器時,如果在WEB服務(wù)器的響應(yīng)中帶有Set-Cookie,則代理轉(zhuǎn)換服務(wù)器把它存起來,在這個設(shè)備后續(xù)訪問時,?代理轉(zhuǎn)換服務(wù)器會從數(shù)據(jù)庫中把Cookie取出來,加到請求里,并發(fā)送給WEB服務(wù)器,這就模擬了設(shè)備支持Cookie的功能。實(shí)現(xiàn)時,我們需要把Cookie解析出來,并加上SessionID,查找時要根據(jù)SessionID和Domain等條件進(jìn)行匹配,滿足條件才加入到請求頭中。同時要定期檢查Cookie是否過期,若過期了,則從數(shù)
3、據(jù)庫中刪除。這里涉及到Cookie的解析和重組,當(dāng)然這非常簡單,我們用一個小程序演示如何用DFA解析Cookie。Cookie的格式為:“NAME=VALUE;expires=DATE;path=PATH;domain=DOMAIN_NAME;Secure”一個Cookie可以看作一個一個的{KEY,VALUE}對,KEY和Value之間用’=’分隔,{KEY,VALUE}對之間用’;’分隔,有的Value是可選的,如Secure。DFA的描述如下:字母表:ASCII碼狀態(tài):KEY前、KEY中,VALUE前,VALUE中和接
4、受狀態(tài)。KEY前狀態(tài)同時是起始狀態(tài)。轉(zhuǎn)換規(guī)則:KEY前狀態(tài)下讀到非空格,進(jìn)入在KEY中。KEY中狀態(tài)下讀到’=’,進(jìn)入VALUE前狀態(tài)。KEY中狀態(tài)下讀到’;’,進(jìn)入KEY前狀態(tài)。VALUE前狀態(tài)下讀到非空格,進(jìn)入VALUE中狀態(tài)。VALUE中狀態(tài)下讀到’;’,?進(jìn)入KEY前。KEY前狀態(tài)、KEY中狀態(tài),VALUE前和VALUE中狀態(tài)下讀到’/0’,進(jìn)入結(jié)束狀態(tài)。每當(dāng)讀到一個完整的{KEY,VALUE},就調(diào)用一個回調(diào)函數(shù)去構(gòu)建Cookie。實(shí)現(xiàn)代碼如下://Build:gcc-DDEBUG-gparsecookie.c-o
5、pc.exe#include?#include?#include?#include??typedef?int?(COOKIE_BUILDER)(void*pBuildCtx,?const?char*key,?const?char*value);//"Set-Cookie:name=value;Expires=date;domain=domainname;path=path;secure;"int?ParseCookie(const?char*psz
6、Cookie,?void*pBuildCtx,COOKIE_BUILDERBuilder){?????????enum?????????{??????????????????STAT_BEFORE_KEY,??????????????????STAT_IN_KEY,??????????????????STAT_BEFORE_VALUE,??????????????????STAT_IN_VALUE?????????}eState=STAT_BEFORE_KEY;?????????char*key=NULL;?????????
7、char*value=NULL;?????????char*pszWorkBuff=NULL;?????????char*p=NULL;?????????assert(pszCookie!=NULL&&Builder!=NULL);?????????pszWorkBuff=(char*)strdup(pszCookie);?????????p=pszWorkBuff;?????????while(*p!=?'/0')?????????{??????????????????switch(eState)?????????????
8、??????{????????????????????????????case?STAT_BEFORE_KEY:?????????????????????????????????????{???????????????????????????????????????????????if(*