明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

怎么應(yīng)用Session開(kāi)發(fā)非Web終端

[摘要]作者: 徐榮勝 Session(會(huì)話)是Web上較為有效的信息交互手段。因其使用方便、穩(wěn)定、安全可靠而被眾多Web開(kāi)發(fā)者所青睞。尤其在互聯(lián)網(wǎng)身份認(rèn)證、網(wǎng)上電子購(gòu)物等方面的應(yīng)用更為廣泛。無(wú)獨(dú)有偶,...
作者: 徐榮勝

  Session(會(huì)話)是Web上較為有效的信息交互手段。因其使用方便、穩(wěn)定、安全可靠而被眾多Web開(kāi)發(fā)者所青睞。尤其在互聯(lián)網(wǎng)身份認(rèn)證、網(wǎng)上電子購(gòu)物等方面的應(yīng)用更為廣泛。無(wú)獨(dú)有偶,筆者在開(kāi)發(fā)一個(gè)財(cái)政項(xiàng)目的數(shù)據(jù)中心平臺(tái)時(shí),覺(jué)得數(shù)據(jù)傳送部分的身份認(rèn)證和信息交互與Web領(lǐng)域的Session控制極其相似。于是就想嘗試一下這新技術(shù),通過(guò)查閱大量資料后覺(jué)得在非Web客戶端用Session進(jìn)行信息交互也切實(shí)可行。經(jīng)過(guò)反復(fù)測(cè)試成功后應(yīng)用于項(xiàng)目中,成效顯著,省去了較多的臨時(shí)數(shù)據(jù)保存以及繁鎖的狀態(tài)檢測(cè),由Session自動(dòng)維持狀態(tài)。
好東西不能獨(dú)享,筆者想把這次成功應(yīng)用Session控制進(jìn)行非Web開(kāi)發(fā)的關(guān)鍵技術(shù)點(diǎn)講述一下,來(lái)共同探討。我們知道Cookie是Web上最常用的跟蹤用戶會(huì)話方式,當(dāng)Cookie被禁止后,一般都用URL重寫(xiě)來(lái)跟蹤會(huì)話。那么Cookie到底是什么東西呢?按照定義:Cookie是一種由服務(wù)器發(fā)送給客戶的片段信息,存儲(chǔ)在客戶環(huán)境中,并且在客戶所有的對(duì)服務(wù)器的請(qǐng)求中都要發(fā)回它。舉個(gè)例子說(shuō),當(dāng)我們用IE登錄某個(gè)電子購(gòu)物商城時(shí),IE在得到商品列表頁(yè)面的同時(shí)還收到Set-Cookie應(yīng)答頭信息。這個(gè)信息的格式為“Set-Cookie:NAME=VALUE;Comment=COMMENT;Domain=DOMAINNMAE;Max-age=SECONDS;Path=PATH;secure;Version=1*DIGIT”,其中NAME值對(duì)(值對(duì)間用分號(hào)分隔)是必須的,其余都是可選的。最重要的信息當(dāng)然也在所必須的值對(duì)里了,VALUE是NAME的值,也是這個(gè)Cookie的標(biāo)識(shí),Max-age定義了Cookie的最長(zhǎng)生存時(shí)間,其它幾個(gè)可選值對(duì)可參閱http://www.faqs.org/rfcs/rfc2109.html。當(dāng)我們選購(gòu)了某種商品,向服務(wù)器發(fā)送選購(gòu)清單時(shí),會(huì)自動(dòng)在你的請(qǐng)求信息頭里加上NAME值對(duì),如果Cookie被禁止,則用URL重寫(xiě)方式在URL請(qǐng)求地址上附加NAME值對(duì)。當(dāng)Web服務(wù)器收到這個(gè)請(qǐng)求后,會(huì)檢查該Cookie是否存在,然后相應(yīng)的跟蹤會(huì)話。從以上分析不難理解,其實(shí)Web服務(wù)器跟蹤會(huì)話就靠Set-Cookie頭信息,跟蹤NAME值對(duì)進(jìn)行身份驗(yàn)證。假如我們用非Web終端接收Web服務(wù)器的響應(yīng)信息,從中解析出Cookie頭信息,當(dāng)再次向Web服務(wù)器發(fā)送請(qǐng)求時(shí)附加上解析出的Cookie信息,Web服務(wù)器據(jù)此不就可以進(jìn)行身份認(rèn)證了嗎?
有了上面的分析,我們寫(xiě)出代碼也非常方便了。下面是筆者用C++Builder 6應(yīng)用程序與Apache Tomcat 4.0服務(wù)引擎中的Servlet交互的演示代碼,僅作參考。

C++客戶端在初次向服務(wù)器發(fā)請(qǐng)求時(shí)的代碼如下:
TIdHTTP *HTTPClient = new TIdHTTP(NULL);
TIdHeaderList * hList;
String URL= "http://localhost:8080/Rev/servlet/test";
try
{
try
{
HTTPClient->Get(URL);
if (HTTPClient->Response != NULL)
{
hList = HTTPClient->Response->ExtraHeaders;
String cookie = hList->Values["Set-Cookie"];
int pos = cookie.Pos(";");
if (pos > 0)
Session_ID = cookie.SubString(1,pos-1);
else
Session_ID = cookie;
}
} catch(Exception& E)
{
}
} __finally
{
HTTPClient->Free();
}
上面代碼中變量URL指向所在Servlet的HTTP地址,根據(jù)各自情況賦值;變量Session_ID為全局變量,記錄Cookie。下次交互時(shí)只需在HTTPClient請(qǐng)求前加上“HTTPClient->Request->ExtraHeaders->Add("Cookie:" + Session_ID);”,Apache Tomcat就會(huì)自動(dòng)判別有效性了。簡(jiǎn)單嗎?

Servlet服務(wù)端的有效性驗(yàn)證也比較容易,具體的Cookie認(rèn)證過(guò)程就讓Apach Tomcat引擎去做了,如下所示:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=GBK");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>身份認(rèn)證</title></head>");
out.println("<body>");
HttpSession session = request.getSession(false);
if (session != null) {
out.println("<p>身份確認(rèn)</p>");
} else {
out.println("<p>認(rèn)證失敗</p>");
}
out.println("</body></html>");
}
代碼中最關(guān)鍵的是“request.getSession(false);”,參數(shù)為true時(shí)Apache Tomcat建立一個(gè)新的Session;參數(shù)為false時(shí)Apache Tomcat會(huì)根據(jù)request中的信息尋找相關(guān)聯(lián)的Session。所以想要維持Session的持續(xù)性,必須用參數(shù)false調(diào)用,但如果長(zhǎng)時(shí)間沒(méi)調(diào)用該Session,Apache Tomcat為合理利用資源會(huì)自動(dòng)使該Session無(wú)效,有關(guān)Apache Tomcat的管理機(jī)制及其配置可參考http://jakarta.apache.org/。
演示代碼中用了C++Builder自帶的TIdHTTP組件,該組件嚴(yán)格按照HTTP規(guī)范實(shí)現(xiàn),Delphi中也有該組件,Visual C++也有類(lèi)似的MFC,可根據(jù)各自熟悉的開(kāi)發(fā)平臺(tái)調(diào)試,調(diào)試時(shí)必須把用于認(rèn)證的Servlet程序加載到Apach Tomcat上,并重新啟動(dòng)Apach Tomcat。以上代碼只供演示而已,要實(shí)際應(yīng)用還需增加各種異常處理和HTTPClient的Request請(qǐng)求包以及Servlet的Response響應(yīng)包的處理,有興趣的朋友可通過(guò)Email:21cnDeveloper@163.com與筆者進(jìn)一步交流。