Java中的cookie管理庫與J2ME結(jié)合
你對Java中的cookie管理庫與J2ME結(jié)合是否熟悉,這里和大家分享一下,為了與網(wǎng)站交互,基于Internet的客戶端應(yīng)用程序經(jīng)常扮演小型網(wǎng)絡(luò)瀏覽器的角色。這些站點使用cookies進行狀態(tài)管理以維護用戶的會話數(shù)據(jù)。
在J2ME中的狀態(tài)管理
J2ME應(yīng)用程序在以下幾種情況要求cookie操作:
◆網(wǎng)站交互:為了與網(wǎng)站交互,基于Internet的客戶端應(yīng)用程序經(jīng)常扮演小型網(wǎng)絡(luò)瀏覽器的角色。這些站點使用cookies進行狀態(tài)管理以維護用戶的會話數(shù)據(jù)。
◆網(wǎng)絡(luò)服務(wù)實現(xiàn):網(wǎng)絡(luò)服務(wù)承諾使網(wǎng)絡(luò)成為電腦機器的友好地方。一個都希望的允許機器-網(wǎng)站進行交互的方法就是在網(wǎng)站前面有一個網(wǎng)絡(luò)服務(wù)。因此,網(wǎng)絡(luò)服務(wù)將目標(biāo)網(wǎng)站的視窗十分友好地呈現(xiàn)在機器面前。這種網(wǎng)絡(luò)服務(wù)的實現(xiàn)將需要cookie操作以達到真正的網(wǎng)站交互。
◆網(wǎng)絡(luò)瀏覽:基于網(wǎng)絡(luò)瀏覽的Java將需要cookie操作模塊以支持狀態(tài)管理。
為了執(zhí)行客戶端cookie操作,先看下面幾個步驟:
◆檢索cookies:
1.從收到的HTTP頭提取cookies。
2.分別解析cookies的組成部分(名稱,值,路徑等等)。
3.判定主機是否允許設(shè)置這些cookies。
◆發(fā)送cookies:
1.判定哪些cookies能被發(fā)送給主機。
2.對于多個cookies,判定必須發(fā)送的cookies的順序。
3.與外發(fā)的HTTP頭一起格式并發(fā)送cookies。
一個客戶端Java應(yīng)用程序須遵循上面的所有步驟,但是用RFC2965列出的規(guī)范執(zhí)行上述步驟將消耗大量的時間并分散開發(fā)者在核心程序上的注意力。結(jié)果,開發(fā)者經(jīng)常選擇向規(guī)范妥協(xié)而用很容易就被破壞的隨意編寫的cookie操作代碼結(jié)束。
例如,假設(shè)你想要寫一個與網(wǎng)絡(luò)商店應(yīng)用程序的servlet交互的Java客戶應(yīng)用程序,在服務(wù)器端,當(dāng)servlet第一次通過調(diào)用request.getsession()為一個會話詢問servlet容器時,容器創(chuàng)建一個新的會話并且服務(wù)器用一個會話ID在并發(fā)請求時檢索會話對象,服務(wù)器自動將這個會話ID作為一個HTTPcookie發(fā)送到客戶端。在并發(fā)請求時,客戶端與請求一起回送同一個會話ID。服務(wù)器用ID區(qū)別正確的會話對象以便servlet處理請求。典型的客戶端代碼如下:
- /*取得cookie.*/...HttpURLConnectionhUC=
- (HttpURLConnection)url.openConnection();
- ...InputStreamis=huc.getInputStream();
- //從響應(yīng)中檢索會話ID.StringcookieVal=
- hc.getHeaderField("Set-Cookie");
- StringsessionId;if(cookieVal!=null){sessionId=
- cookieVal.substring(0,cookieVal.indexOf(";"));}..
- ./*發(fā)送cookie.*/HttpURLConnectionhuc=
- (HttpURLConnection)url.openConnection();
- if(sessionId!=null){huc.setRequestPRoperty("Cookie",sessionId);
- }InputStreamis=huc.getInputStream();...
cookie規(guī)范RFC2965為cookies版本1定義了一個新報頭,Set-Cookie2。假如我們用新報頭升級服務(wù)器,上面的代碼將不能履行。上述代碼也不能處理多重cookies。另外,版本1的cookie值可以是一個加引號的字符串,假如會話cookie的值是一個包含分號的加引號字符串,這也將引起上述代碼不能履行。簡而言之,上面的代碼片斷不是與cookie的版本使用孤立開來的。
上述代碼對于只和一個特別的主機及路徑影射交互的簡單程序是適合的,但對于一個更龐大的應(yīng)用程序,當(dāng)涉及多重主機及路徑時cookie管理將變得更復(fù)雜。開發(fā)者實現(xiàn)cookie規(guī)范中的所有算法、安全檢查及平衡將證明是痛苦和徒然的。
進入jCookie
為了減輕這種情形,我開發(fā)了一個普通用途cookie庫,命名為jCookie,用來實現(xiàn)cookie規(guī)范。這個庫使客戶端cookie操作所必需的額外代碼和努力最小化并讓開發(fā)者的精力集中在核心應(yīng)用程序上。其他APIs庫也有(例如,Apache的HTTPClient),但是他們使用了從內(nèi)建本地的java.netAPIs移出的結(jié)構(gòu),因此需要一個新的學(xué)習(xí)過程。我的API是一個調(diào)用已存在的java.net對象的簡單方法。
你也能使用現(xiàn)在發(fā)展的jCookie延伸版本,叫jCookieMicro,在J2ME移動設(shè)備上創(chuàng)建一套令人激動的能與網(wǎng)絡(luò)服務(wù)應(yīng)用程序交互的客戶系統(tǒng)。
現(xiàn)在我介紹jCookieAPI的主要行為,先從兩個主要數(shù)據(jù)結(jié)構(gòu)開始:
1.Cookie類:此類的一個實例表明一個獨立的cookie。它封裝了RFC2965定義的所有cookie屬性并提供用getters和setters訪問這些屬性。
2.CookieJar類:此類的一個實例被作為一個Cookie對象集的容器。它符合集合結(jié)構(gòu)并提供操作cookie集合的方法。
API提供兩個視野以同時滿足開發(fā)者對于cookie透明操作的要求及開發(fā)者對于高級特性的要求。下面的圖形說明了這些視野或?qū)印?/p>
jCookie庫的分層視圖
【編輯推薦】
- 深入探究J2ME Hashtable實現(xiàn)原理
- 探究J2ME中cookie庫的管理
- J2ME數(shù)據(jù)結(jié)構(gòu)中Hashtable和Vector的使用
- MotorolaJ2ME開發(fā)時需要注意的幾個細節(jié)
- Java2平臺J2SE、J2EE、J2ME三大版本的區(qū)別