標籤:
摘要 任何系統在沒有使用者登入就可操作資料是非常危險的,連結用戶端與伺服器的是使用者登入後的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.jsp19 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
Android與後台資料互動學習