如何應用Session開發非Web終端

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 如何應用Session開發非Web終端 (http://www.webasp.net/article/18/17026.htm)
-- 作者:未知
-- 發佈日期: 2005-03-16


如何應用Session開發非Web終端





協議s

— 作者 sunggsun @ 20:27




Session(會話)是Web上較為有效的信息交互手段。因其使用方便、穩定、安全可靠而被眾多Web開發者所青睞。尤其在互聯網身份認證、網上電子購物等方面的應用更為廣泛。無獨有偶,筆者在開發一個財政項目的數據中心平台時,覺得數據傳送部分的身份認證和信息交互與Web領域的Session控制極其相似。於是就想嘗試一下這新技術,通過查閱大量資料後覺得在非Web客戶端用Session進行信息交互也切實可行。經過反覆測試成功後應用於項目中,成效顯著,省去了較多的臨時數據保存以及繁鎖的狀態檢測,由Session自動維持狀態。

好東西不能獨享,筆者想把這次成功應用Session控制進行非Web開發的關鍵技術點講述一下,來共同探討。我們知道Cookie是Web上最常用的跟蹤用戶會話方式,當Cookie被禁止後,一般都用URL重寫來跟蹤會話。那麼Cookie到底是什麼東西呢?按照定義:Cookie是一種由服務器發送給客戶的片段信息,存儲在客戶環境中,並且在客戶所有的對服務器的請求中都要發回它。舉個例子說,當我們用IE登錄某個電子購物商城時,IE在得到商品列表頁面的同時還收到Set-Cookie應答頭信息。這個信息的格式為「Set-Cookie:NAME=VALUE;Comment=COMMENT;Domain=DOMAINNMAE;Max-age=SECONDS;Path=PATH;secure;Version=1*DIGIT」,其中NAME值對(值對間用分號分隔)是必須的,其餘都是可選的。最重要的信息當然也在所必須的值對裡了,VALUE是NAME的值,也是這個Cookie的標識,Max-age定義了Cookie的最長生存時間,其它幾個可選值對可參閱http://www.faqs.org/rfcs/rfc2109.html。當我們選購了某種商品,向服務器發送選購清單時,會自動在你的請求信息頭裡加上NAME值對,如果Cookie被禁止,則用URL重寫方式在URL請求地址上附加NAME值對。當Web服務器收到這個請求後,會檢查該Cookie是否存在,然後相應的跟蹤會話。從以上分析不難理解,其實Web服務器跟蹤會話就靠Set-Cookie頭信息,跟蹤NAME值對進行身份驗證。假如我們用非Web終端接收Web服務器的響應信息,從中解析出Cookie頭信息,當再次向Web服務器發送請求時附加上解析出的Cookie信息,Web服務器據此不就可以進行身份認證了嗎?
有了上面的分析,我們寫出代碼也非常方便了。下面是筆者用C++Builder 6應用程序與Apache Tomcat 4.0服務引擎中的Servlet交互的演示代碼,僅作參考。

C++客戶端在初次向服務器發請求時的代碼如下:
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地址,根據各自情況賦值;變量Session_ID為全局變量,記錄Cookie。下次交互時只需在HTTPClient請求前加上「HTTPClient->Request->ExtraHeaders->Add("Cookie:" + Session_ID);」,Apache Tomcat就會自動判別有效性了。簡單嗎?

Servlet服務端的有效性驗證也比較容易,具體的Cookie認證過程就讓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>身份認證</title></head>");
out.println("<body>");
HttpSession session = request.getSession(false);
if (session != null) {
out.println("<p>身份確認</p>");
} else {
out.println("<p>認證失敗</p>");
}
out.println("</body></html>");
}
代碼中最關鍵的是「request.getSession(false);」,參數為true時Apache Tomcat建立一個新的Session;參數為false時Apache Tomcat會根據request中的信息尋找相關聯的Session。所以想要維持Session的持續性,必須用參數false調用,但如果長時間沒調用該Session,Apache Tomcat為合理利用資源會自動使該Session無效,有關Apache Tomcat的管理機制及其配置可參考http://jakarta.apache.org/。
演示代碼中用了C++Builder自帶的TIdHTTP組件,該組件嚴格按照HTTP規範實現,Delphi中也有該組件,Visual C++也有類似的MFC,可根據各自熟悉的開發平台調試,調試時必須把用於認證的Servlet程序加載到Apach Tomcat上,並重新啟動Apach Tomcat。以上代碼只供演示而已,要實際應用還需增加各種異常處理和HTTPClient的Request請求包以及Servlet的Response響應包的處理,有興趣的朋友可通過Email:21cnDeveloper@163.com與筆者進一步交流。


webasp.net