在解析網頁信息的時候,需要登錄后才能訪問,所以使用httpclient模擬登錄,然后把cookie保存下來,以供下一次訪問使用,這時就需要持久化cookie中的內容。
在之前先科普一下基礎知識:
什么是Cookies?
Cookies 是一些小文件,它們被創建在客戶端的系統里,或者被創建在客戶端瀏覽器的內存中(如果是臨時性的話)。用它可以實現狀態管理的功能。我們可以存儲一些少量 信息到可以短的系統上,以便在需要的時候使用。最有趣的事情是,它是對用戶透明的。在你的web應用程序中,你可以到處使用它,它極其得簡單。 Cookies是以文本形式存儲的。如果一個web應用程序使用cookies,那么服務器負責發送cookies,客戶端瀏覽器將存儲它。瀏覽器在下次 請求頁面的時候,會返回cookies給服務器。最常用的例子是,使用一個cookie來存儲用戶信息,用戶的喜好,“記住密碼”操作等。Cookies 有許多優點,當然也有許多缺點。我將在接下來講述。
Cookies是如何創建的?
當 一個客戶端向服務器發出請求,服務器發送cookies給客戶端。而相同的cookies可以被后續的請求使用。例如,如果 codeproject.com將Session ID作為cookies存儲。當一個客戶端首次向web服務器請求頁面,服務器生成Session ID,並將其作為cookies發送往客戶端。
現在,所有來自相同客戶端的后續請求,它將使用來自cookies的Session ID,就像下面這幅圖片展示的那樣。
瀏覽器和web服務器以交換cookies信息來作為響應。對不同的站點,瀏覽器會維護不同的cookies。如果一個頁面需要cookies中的信息,當某個URL被“點擊”,首先瀏覽器將搜索本地系統的cookies的信息,然后才轉向服務器來獲得信息。
Cookies的優勢
下面是使用cookies的主要優勢:
(1) 實現和使用都是非常簡單的
(2) 由瀏覽器來負責維護發送過來的數據(cookies內容)
(3) 對來自多個站點的cookies來講,瀏覽器自動管理它們
Cookies的劣勢
下面是cookies的主要劣勢:
(1) 它以簡單的文本格式來存儲數據,所以它一點也不安全
(2) 對於cookies數據,有大小限制(4kB)
(3) Cookies最大數目也有限制。主流瀏覽器提供將cookies的個數限制在20條。如果新cookies到來,那么老的將被刪除。有些瀏覽器能支持到300條的cookies數。
(4) 我們需要配置瀏覽器,cookies將不能工作在瀏覽器配置的高安全級別環境下。
什么是持久化的和非持久化的Cookies
我們可以將cookies分成兩類:
(1) 持久化的cookies
(2) 非持久化的cookies
持久化的cookies:這可以被稱為永久性的cookies,它被存儲在客戶端的硬盤內,直到它們失效。持久化的cookies應該被設置一個失效時間。有時,它們會一直存在直到用戶刪除它們。持久化的cookies通常被用來為某個系統收集一個用戶的標識信息。
非持久化cookies:也可以被稱之為臨時性的cookies。如果沒有定義失效時間,那么cookie將會被存儲在瀏覽器的內存中。我上面展示的例子就是一個非持久的cookies。
修改一個持久化的cookies與一個非持久化的cookies並沒有什么不同。它們唯一的區別是——持久化的cookies有一個失效時間的設置。
Cookie持久化
HttpClient 可以和任意物理表示的實現了CookieStore接口的持久化cookie存儲一起使用。默認的CookieStore實現稱為 BasicClientCookie,這是憑借java.util.ArrayList的一個簡單實現。在BasicClientCookie對象中存儲 的cookie當容器對象被垃圾回收機制回收時會丟失。如果需要,用戶可以提供更復雜的實現。
下載着重介紹在安卓中如何利用httpclient來實現對cookie的持久化操作:
一、請求網絡獲取cookie
先看一下下面的代碼:
- DefaultHttpClient httpclient = new DefaultHttpClient();
- HttpGet httpget = new HttpGet("http://www.hlovey.com");
- HttpResponse response = httpclient.execute(httpget);
- HttpEntity entity = response.getEntity();
- List<Cookie> cookies = httpclient.getCookieStore().getCookies(); //執行了請求后才會有cookie
Post模擬登錄
- HttpPost httpPost = new HttpPost(url);
- List<NameValuePair> formparams = new ArrayList<NameValuePair>();
- formparams.add(new BasicNameValuePair("id", userid));
- formparams.add(new BasicNameValuePair("passwd", passwd));
- UrlEncodedFormEntity entity;
- try {
- entity = new UrlEncodedFormEntity(formparams, mobileSMTHEncoding);
- } catch (UnsupportedEncodingException e1) {
- return 3;
- }
- httpPost.setEntity(entity);
- httpPost.setHeader("User-Agent", userAgent);
- HttpResponse response = httpClient.execute(httpPost);