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