Android與后台數據交互學習


摘要 任何系統在沒有用戶登錄就可操作數據是非常危險的,鏈接客戶端與服務器的是用戶登錄后的session,用戶登錄系 統后存在一個sessionid,這個sessionid就是客戶端的cookie,客戶端獲取到sessionid設置cookie后就可以發起任意的 HTTP服務器請求了。

HTTP 客戶端編程中最常碰見的問題,很多網站的內容都只是對注冊用戶可見的,這種情況下就必須要求使用正確的用戶名和口令登錄成功后,方可瀏覽到想要的頁面。因 為HTTP協議是無狀態的,也就是連接的有效期只限於當前請求,請求內容結束后連接就關閉了。在這種情況下為了保存用戶的登錄信息必須使用到Cookie 機制。以JSP/Servlet為例,當瀏覽器請求一個JSP或者是Servlet的頁面時,應用服務器會返回一個參數,名為jsessionid(因不 同應用服務器而異),值是一個較長的唯一字符串的Cookie,這個字符串值也就是當前訪問該站點的會話標識。瀏覽器在每訪問該站點的其他頁面時候都要帶 上jsessionid這樣的Cookie信息,應用服務器根據讀取這個會話標識來獲取對應的會話信息。

       對於需要用戶登錄的網站,一般在 用戶登錄成功后會將用戶資料保存在服務器的會話中,這樣當訪問到其他的頁面時候,應用服務器根據瀏覽器送上的Cookie中讀取當前請求對應的會話標識以 獲得對應的會話信息,然后就可以判斷用戶資料是否存在於會話信息中,如果存在則允許訪問頁面,否則跳轉到登錄頁面中要求用戶輸入帳號和口令進行登錄。這就 是一般使用JSP開發網站在處理用戶登錄的比較通用的方法。

         這樣一來,對於HTTP的客戶端來講,如果要訪問一個受保護的頁面時就必須模 擬瀏覽器所做的工作,首先就是請求登錄頁面,然后讀取Cookie值;再次請求登錄頁面並加入登錄頁所需的每個參數;最后就是請求最終所需的頁面。當然在 除第一次請求外其他的請求都需要附帶上Cookie信息以便服務器能判斷當前請求是否已經通過驗證。說了這么多,可是如果你使用httpclient的 話,你甚至連一行代碼都無需增加,你只需要先傳遞登錄信息執行登錄過程,然后直接訪問想要的頁面,跟訪問一個普通的頁面沒有任何區別,因為類 HttpClient已經幫你做了所有該做的事情了,太棒了!下面的例子實現了這樣一個訪問的過程。

 1 package http.demo; 
 2 import org.apache.commons.httpclient.*;
 3 import org.apache.commons.httpclient.cookie.*;
 4 import org.apache.commons.httpclient.methods.*; 
 5   
 6 /** 
 7  * 用來演示登錄表單的示例 
 8  * @author Liudong 
 9  */
10 public class FormLoginDemo {
11    static final String LOGON_SITE = "localhost" ;
12    static final int     LOGON_PORT = 8080;
13   
14    public static void main(String[] args) throws Exception{
15       HttpClient client = new HttpClient();
16       client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);
17   
18       // 模擬登錄頁面 login.jsp->main.jsp
19       PostMethod post = new PostMethod( "/main.jsp" );
20       NameValuePair name = new NameValuePair( "name" , "ld" );
21       NameValuePair pass = new NameValuePair( "password" , "ld" );
22       post.setRequestBody( new NameValuePair[]{name,pass});
23       int status = client.executeMethod(post);
24       System.out.println(post.getResponseBodyAsString());
25       post.releaseConnection();
26   
27       // 查看 cookie 信息
28       CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
29       Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/" , false , client.getState().getCookies());
30       if (cookies.length == 0) {
31          System.out.println( "None" );
32       } else {
33          for ( int i = 0; i < cookies.length; i++) {
34             System.out.println(cookies[i].toString());
35          }
36       }
37   
38       // 訪問所需的頁面 main2.jsp 
39       GetMethodget=newGetMethod("/main2.jsp");
40       client.executeMethod(get);
41       System.out.println(get.getResponseBodyAsString());
42       get.releaseConnection();
43    }

參考:http://my.oschina.net/u/218583/blog/42923

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM