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