摘要 任何系統在沒有用戶登錄就可操作數據是非常危險的,鏈接客戶端與服務器的是用戶登錄后的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