Java中的cookie管理庫與J2ME結合
你對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庫的分層視圖
【編輯推薦】
- 深入探究J2ME Hashtable實現原理
- 探究J2ME中cookie庫的管理
- J2ME數據結構中Hashtable和Vector的使用
- MotorolaJ2ME開發時需要注意的幾個細節
- Java2平臺J2SE、J2EE、J2ME三大版本的區別