国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java中的cookie管理方案(3)-與J2ME結(jié)合

2019-11-18 16:04:30
字體:
供稿:網(wǎng)友
jCookie結(jié)構(gòu)
下面我將描述層及他們使用的不同的類。
層1
那些開發(fā)者多數(shù)都想進(jìn)行透明cookie操作,這通常是使用層1的情形。在這個(gè)級(jí)別,你用Client類操作cookies。它有兩個(gè)主要的方法:
? public CookieJar getCookies(URLConnection urlConn): 這個(gè)方法從給出的URLConnection中析取cookies,將它們解析到Cookie對(duì)象,并作為一個(gè)CookieJar返回。
? public CookieJar setCookies(URLConnection urlConn, CookieJar cj): 這個(gè)方法從CookieJar中提取合適的Cookie對(duì)象并設(shè)置URLConnection的報(bào)頭。
層0
這些開發(fā)者沒有在使用層0的代碼中深入就無法呼吸(包括我)。在這里,你可以通過使用cookie操作代碼改變解析邏輯和安全規(guī)則。要這樣做,首先實(shí)現(xiàn)CookieParser接口,它有以下四個(gè)方法:
? public Header getCookieHeaders(CookieJar cj): 在CookieJar中轉(zhuǎn)換Cookies為一報(bào)頭以適合與一個(gè)HTTP請(qǐng)求一起發(fā)送。
? public boolean allowedCookie(Cookie c, URL url): 檢查是否一個(gè)給出URL的請(qǐng)求能返回指定的Cookie。
? public CookieJar parseCookies(Header h, URL url): 在一個(gè)HTTP響應(yīng)中將報(bào)頭轉(zhuǎn)換到一個(gè)Cookie對(duì)象的CookieJar中。
? public boolean sendCookieWithURL(Cookie c, URL url, boolean bRespectEXPires): 檢查是否給出的Cookie能被與給出URL的一個(gè)請(qǐng)求一起發(fā)送。
你能使用Client類的setCookieParser(CookieParser cp)方法去設(shè)置CookieParser實(shí)現(xiàn)。被庫缺省使用的CookieParser是一個(gè)RFC 2965 cookie規(guī)范中的實(shí)現(xiàn)。
在層1,jCookie作為一個(gè)庫;在層0,它成為一個(gè)API的基礎(chǔ)。
jCookie用法
Client類在兩個(gè)層都調(diào)用cookie操作邏輯。它提供了應(yīng)用程序開發(fā)者的庫架構(gòu)。要使用jCookie庫,按照下面這些步驟:
? 從響應(yīng)到請(qǐng)求檢索cookies:
創(chuàng)建一個(gè)URLConnection對(duì)象并初始化。
連接URLConnection。
創(chuàng)建一個(gè)Client對(duì)象并設(shè)定一個(gè)定制的CookieParser。
通過調(diào)用Client實(shí)例的getCookies()方法得到一個(gè)Cookies的CookieJar,作為在URLConnection中的一個(gè)參數(shù)。
與HTTP響應(yīng)一起作一些事情。

? 和一個(gè)請(qǐng)求(假定一個(gè)CookieJar已被檢索)一起發(fā)送cookies:
創(chuàng)建一個(gè)URLConnection對(duì)象并初始化。
創(chuàng)建一個(gè)Client對(duì)象并設(shè)定一個(gè)定制的CookieParser。
通過調(diào)用Client實(shí)例的setCookies()方法設(shè)置cookie報(bào)頭,作為URLConnection and CookieJar 中的參數(shù)。
連接URLConnection。
與HTTP響應(yīng)一起作一些事情。

下面的摘錄顯示了普通jCookie的用法。這個(gè)jCookie代碼十分突出:


import com.sonalb.net.http.cookie.*;
import java.net.*;
import java.io.*;
...
public class Example
{
...
public void someMethod()
{
...
URL url = new URL("http://www.site.com/");
HttpURLConnection hUC = (HttpURLConnection) url.openConnection();
//在這里初始化HttpURLConnection.
...
huc.connect();
InputStream is = huc.getInputStream();
Client client = new Client();
CookieJar cj = client.getCookies(huc);
//進(jìn)行一些處理
...
huc.disconnect();
// 執(zhí)行另一請(qǐng)求
url = new URL("http://www.site.com/");
huc = (HttpURLConnection) url.openConnection();
client.setCookies(huc, cj);
huc.connect();
...
// 進(jìn)行一些處理
}
}



上面的代碼描述了jCookie API的兩個(gè)方面:
? 本地java.net對(duì)象的使用(HttpURLConnection)。
? 輕易地回收和發(fā)送cookies(單個(gè)方法調(diào)用)。
在實(shí)踐中,上述代碼已經(jīng)能成功地維護(hù)兩個(gè)請(qǐng)求間的會(huì)話。現(xiàn)在我們轉(zhuǎn)換層的基本結(jié)構(gòu),讓我們將jCookie與一些真實(shí)代碼連接。
Hotmail新郵件檢測(cè)器
為了闡明jCookie庫的使用方便,我將在一個(gè)顯示一個(gè)Hotmail賬號(hào)新消息的發(fā)件人、主題及日期字段的應(yīng)用程序中使用它。為了簡(jiǎn)單起見,應(yīng)用程序在控制臺(tái)顯示這些信息。為了在Hotmail收件箱接收新消息,應(yīng)用程序需要完成以下步驟:
? 在登錄表單中執(zhí)行一個(gè)HTTP POST操作登錄Hotmail。
? 為了到達(dá)主頁,操作重定向及cookies。
? 檢索收件箱的Html頁。
? 提取新消息的相關(guān)字段。
多數(shù)站點(diǎn)要求用戶第一次通過一個(gè)表單執(zhí)行一個(gè)HTTP POST 操作以完成登錄過程。為了成功鑒定身份,POST的響應(yīng)通常是一個(gè)帶一些cookie報(bào)頭的HTTP重定向。當(dāng)重定向頁被請(qǐng)求時(shí)cookies返回給服務(wù)器。
jCookie庫包括一個(gè)很有用的類叫HTTPRedirectHandler,它管理當(dāng)完成客戶端cookie操作時(shí)操作重定向的普通任務(wù)。要使用這個(gè)類,首先要在一個(gè)未連接的HttpURLConnection中創(chuàng)建一個(gè)HTTPRedirectHandler實(shí)例,然后調(diào)用HTTPRedirectHandler實(shí)例的connect()方法去操作重定向及cookie。句柄從HTTP響應(yīng)代碼中確定是否運(yùn)行成功。一旦進(jìn)程完成,調(diào)用的類就檢索表明最后一次請(qǐng)求的HttpURLConnection對(duì)象。CookieJar包含所有在能被檢索的重定向過程中接收的cookies。Cookie操作邏輯存在于HTTPRedirectHandler的connect()方法中。讓我們來看一看這個(gè)方法的代碼。Cookie操作部份進(jìn)行了注釋:



package com.sonalb.net.http;
import com.sonalb.net.http.cookie.*;
import java.net.*;
import java.io.*;
public class HTTPRedirectHandler
{
...
public HTTPRedirectHandler(HttpURLConnection huc)
{
...
}
public void connect() throws IOException
{
if(bConnected)
{
throw new IllegalStateException("No can do. Already connected.");
}
int code;
URL url;
huc.setFollowRedirects(false);
// 設(shè)置在Cookies中的檢驗(yàn)
if(!cj.isEmpty())
{
client.setCookies(huc,cj);
}
is = huc.getInputStream();
// 從HttpURLConnection中提取Cookies并加到CookieJar中去
cj.addAll(Client.getCookies(huc));
while((code = huc.getResponseCode()) != successCode && maxRedirects > 0)
{
if(code != 302)
{
throw new IOException("Can't deal with this code (" + code + ").");
}
is.close();
is = null;
url = new URL(huc.getHeaderField("location"));
huc.disconnect();
huc = null;
huc = (HttpURLConnection) url.openConnection();
//和HTTP請(qǐng)求一起發(fā)送Cookies
Client.setCookies(huc, cj);
huc.setFollowRedirects(false);
huc.connect();
is = huc.getInputStream();
//從響應(yīng)中提取Cookies并加進(jìn)jar中去
cj.addAll(Client.getCookies(huc));
maxRedirects--;
}
if(maxRedirects <= 0 && code != successCode)
{
throw new IOException("Max redirects exhausted.");
}
bConnected = true;
}
//其他方法在這里出現(xiàn)
public void handleCookies(boolean b)
{
...
}
public void setSuccessCode(int i)
{
...
}
public void setCookieJar(CookieJar cj)
{
...
}
public void addCookies(CookieJar cj)
{
...
}
public CookieJar getCookieJar()
{
...
}
public HttpURLConnection getConnection()
{
...
}
public void setMaxRedirects(int i)
{
...
}
}



HotmailChecker應(yīng)用程序使用HTTPRedirectHandler進(jìn)行登錄操作。應(yīng)用程序從使用帶有并發(fā)請(qǐng)求的HTTPRedirectHandler中檢索CookieJar。HotmailChecker的相關(guān)部份顯示如下。Hotmail細(xì)節(jié)和jCookie關(guān)聯(lián)注釋被突出顯示:


public boolean doLogin() throws Exception
{
//對(duì)于HTTPS初始化JSSE
System.getProperties().put("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
//創(chuàng)建HttpURLConnection并初始化
URL url = new URL("https://lc2.law13.hotmail.passport.com/cgi-bin/dologin");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setDoOutput(true);
huc.setRequestMethod("POST");
huc.setRequestProperty("User-Agent","Mozilla/4.7 [en] (Win98; I)");
//發(fā)送登錄表單字段
StringBuffer sb = new StringBuffer();
sb.append("login="); sb.append(URLEncoder.encode(user));
...
OutputStream os = huc.getOutputStream();
os.write(sb.toString().getBytes("US-ASCII"));
os.close();
//創(chuàng)建句柄并進(jìn)行處理
HTTPRedirectHandler hrh = new HTTPRedirectHandler(huc);
hrh.connect();
huc = hrh.getConnection();
//Microsoft有一個(gè)中間過渡頁使用了一個(gè)刷新元標(biāo)簽以便于在HTTPS和HTTP間轉(zhuǎn)換,這將防止安全
//警告彈出
//我們需要通過讀取響應(yīng)和解析URL手動(dòng)取出URL
BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));
...
//一旦我們有了主頁的URL,我們就又使用HTTPRedirectHandler重定向并處理響應(yīng)以校驗(yàn)正確的注
//冊(cè)
url = new URL(homeUrl);
huc = (HttpURLConnection) url.openConnection();
huc.setRequestProperty("User-Agent","Mozilla/4.7 [en] (Win98; I)");
hrh = new HTTPRedirectHandler(huc);
hrh.setCookieJar(cj);
hrh.connect();
...
//保存Cookies用于以后的請(qǐng)求
cj.addAll(hrh.getCookieJar());
...
return(bLoggedIn);
}



現(xiàn)在我們已經(jīng)登錄到Hotmail,我們請(qǐng)求收件箱頁,在登錄過程中已檢索的Cookies中通過。一旦我們擁有了收件箱頁,我們必須因?yàn)榕c新消息有關(guān)的信息而解析這個(gè)HTML。代替使用暴力的StringTokenizer檢索這個(gè)信息,我們將用一個(gè)稍微文雅(既復(fù)雜的)方法調(diào)控xml。這種方法包括:
? 將成形不好的HTML轉(zhuǎn)換為well-formed HTML。
? 用DOM(文檔對(duì)象模型)通過well-formed HTML去得到新消息的信息。
假如DOM、XML和well-formed 對(duì)你來說一竅不通,只要說我們把收件箱HTML轉(zhuǎn)換成一個(gè)樹狀結(jié)構(gòu)的對(duì)象并得到想要的信息就足夠了。
要將成形不好的HTML轉(zhuǎn)換成well-formed HTML,我們用一個(gè)可自由下載的組件JTidy工具和一個(gè)通用的處理器。ConvertBaDHTMLToGood幫助類將成形不好的Hotmail HTML轉(zhuǎn)換成well-formed HTML。相關(guān)代碼顯示如下:



import java.io.*;
import org.w3c.tidy.*;
public class ConvertBadHTMLToGood
{
...
public ConvertBadHTMLToGood(Reader r)
{
if(r == null)
{
throw new IllegalArgumentException();
}
inReader = r;
}
public Reader doConvert() throws IOException
{
//初始化JTidy對(duì)象
Tidy tidy = new Tidy();
tidy.setXmlOut(true);
tidy.setErrout(new PrintWriter(new StringWriter()));
//JTidy解析器要求一個(gè)InputStream,對(duì)于我的知識(shí)來說這里沒有直接的辦法將一個(gè)Reader轉(zhuǎn)換
//成一個(gè)InputStream。這個(gè)工作區(qū)代碼沒有字符編碼安全,但還可以混過。
BufferedReader br = new BufferedReader(inReader);
StringBuffer sb = new StringBuffer();
String line;
while((line = br.readLine()) != null)
{
sb.append(line);
sb.append("");
}
ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes("US-ASCII"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//作一個(gè)將HTML轉(zhuǎn)換well-formed HTML 的預(yù)備。
tidy.parse(bais, baos);
//整理一些遺漏的JTidy得到能被“true-blue”XML解析器解析的輸出。
FixEntities fe = new FixEntities(baos.toString());
return(fe.getFixedReader());
}



一旦我們擁有了well-formed HTML,我們就用XML解析的Java API(JAXP)去轉(zhuǎn)換well-formed HTML 成一個(gè)DOM樹并通過樹得到新消息的表單、主題及日期字段。我將忽略一些代碼而向你展示如何使用HotmailChecker:


import com.sonalb.net.http.cookie.*;
...
public class HotmailChecker
{
public static void main(String args[]) throws Exception
{
if(args.length != 2)
{
usage();
System.exit(0);
}
String uname = args[0];
String pass = args[1];
HotmailChecker hmc = new HotmailChecker(uname,pass);
if(!hmc.doLogin())
{
System.out.println("Could not login to Hotmail.");
System.exit(0);
}
Vector newMessages = hmc.getNewMessages();
if(newMessages == null)
{
System.out.println("No NEW Messages.");
return;
}
System.out.println("You have " + newMessages.size() + " NEW Messages");
System.out.println("---------------------------------------------");
Iterator iter = newMessages.iterator();
//HMMessage封裝了一個(gè)Hotmail消息
HMMessage hm;
while(iter.hasNext())
{
hm = (HMMessage) iter.next();
System.out.println(" From: " + hm.getFrom());
System.out.println(" Subject: " + hm.getSubject());
System.out.println("Sent Date: " + hm.getSentDate());
System.out.println("---------------------------------------------");
}
}
static void usage()
{
System.out.println("Usage: java HotmailChecker ");
}
//實(shí)例變量和方法從這里開始
...
public HotmailChecker(String username, String passWord)
{
...
}
public boolean doLogin() throws Exception
{
...
}
public Vector getNewMessages() throws Exception
{
...
}
...
}



你可以從Resources下載完全功能的HotmailChecker及相關(guān)類。

(出處:http://m.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 炉霍县| 含山县| 阳东县| 宣武区| 宜兰市| 津南区| 望都县| 淄博市| 玛沁县| 邯郸市| 延吉市| 青浦区| 河间市| 兰坪| 邛崃市| 金门县| 墨江| 宁晋县| 潜山县| 合水县| 慈溪市| 上蔡县| 富阳市| 乌拉特后旗| 荥经县| 温宿县| 昔阳县| 彩票| 新源县| 乌兰察布市| 济源市| 滦南县| 绥阳县| 潮安县| 长乐市| 汝城县| 岳阳县| 南宁市| 卢氏县| 卢氏县| 黎川县|