<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-179  評(píng)論-666  文章-29  trackbacks-0
    阿里云服務(wù)器優(yōu)惠券

    HttpClient 是我最近想研究的東西,以前想過(guò)的一些應(yīng)用沒(méi)能有很好的實(shí)現(xiàn),發(fā)現(xiàn)這個(gè)開(kāi)源項(xiàng)目之后就有點(diǎn)眉目了,令人頭痛的cookie問(wèn)題還是有辦法解決滴。在網(wǎng)上整理了一些東西,寫得很好,寄放在這里。

    HTTP 協(xié)議可能是現(xiàn)在 Internet 上使用得最多、最重要的協(xié)議了,越來(lái)越多的 Java 應(yīng)用程序需要直接通過(guò) HTTP 協(xié)議來(lái)訪問(wèn)網(wǎng)絡(luò)資源。雖然在 JDK 的 java.net 包中已經(jīng)提供了訪問(wèn) HTTP 協(xié)議的基本功能,但是對(duì)于大部分應(yīng)用程序來(lái)說(shuō),JDK 庫(kù)本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項(xiàng)目,用來(lái)提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。HttpClient 已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如 Apache Jakarta 上很著名的另外兩個(gè)開(kāi)源項(xiàng)目 Cactus 和 HTMLUnit 都使用了 HttpClient,更多使用 HttpClient 的應(yīng)用可以參見(jiàn)http://wiki.apache.org/jakarta-httpclient/HttpClientPowered。HttpClient 項(xiàng)目非常活躍,使用的人還是非常多的。目前 HttpClient 版本是在 2005.10.11 發(fā)布的 3.0 RC4 。

    ------------------------------------

    應(yīng)用HttpClient來(lái)對(duì)付各種頑固的WEB服務(wù)器
    轉(zhuǎn)自:http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx

    一般的情況下我們都是使用IE或者Navigator瀏覽器來(lái)訪問(wèn)一個(gè)WEB服務(wù)器,用來(lái)瀏覽頁(yè)面查看信息或者提交一些數(shù)據(jù)等等。所訪問(wèn)的這些頁(yè)面有的僅僅是一些普通的頁(yè)面,有的需要用戶登錄后方可使用,或者需要認(rèn)證以及是一些通過(guò)加密方式傳輸,例如HTTPS。目前我們使用的瀏覽器處理這些情況都不會(huì)構(gòu)成問(wèn)題。不過(guò)你可能在某些時(shí)候需要通過(guò)程序來(lái)訪問(wèn)這樣的一些頁(yè)面,比如從別人的網(wǎng)頁(yè)中“偷”一些數(shù)據(jù);利用某些站點(diǎn)提供的頁(yè)面來(lái)完成某種功能,例如說(shuō)我們想知道某個(gè)手機(jī)號(hào)碼的歸屬地而我們自己又沒(méi)有這樣的數(shù)據(jù),因此只好借助其他公司已有的網(wǎng)站來(lái)完成這個(gè)功能,這個(gè)時(shí)候我們需要向網(wǎng)頁(yè)提交手機(jī)號(hào)碼并從返回的頁(yè)面中解析出我們想要的數(shù)據(jù)來(lái)。如果對(duì)方僅僅是一個(gè)很簡(jiǎn)單的頁(yè)面,那我們的程序會(huì)很簡(jiǎn)單,本文也就沒(méi)有必要大張旗鼓的在這里浪費(fèi)口舌。但是考慮到一些服務(wù)授權(quán)的問(wèn)題,很多公司提供的頁(yè)面往往并不是可以通過(guò)一個(gè)簡(jiǎn)單的URL就可以訪問(wèn)的,而必須經(jīng)過(guò)注冊(cè)然后登錄后方可使用提供服務(wù)的頁(yè)面,這個(gè)時(shí)候就涉及到COOKIE問(wèn)題的處理。我們知道目前流行的動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)例如ASP、JSP無(wú)不是通過(guò)COOKIE來(lái)處理會(huì)話信息的。為了使我們的程序能使用別人所提供的服務(wù)頁(yè)面,就要求程序首先登錄后再訪問(wèn)服務(wù)頁(yè)面,這過(guò)程就需要自行處理cookie,想想當(dāng)你用java.net.HttpURLConnection來(lái)完成這些功能時(shí)是多么恐怖的事情啊!況且這僅僅是我們所說(shuō)的頑固的WEB服務(wù)器中的一個(gè)很常見(jiàn)的“頑固”!再有如通過(guò)HTTP來(lái)上傳文件呢?不需要頭疼,這些問(wèn)題有了“它”就很容易解決了!

    我們不可能列舉所有可能的頑固,我們會(huì)針對(duì)幾種最常見(jiàn)的問(wèn)題進(jìn)行處理。當(dāng)然了,正如前面說(shuō)到的,如果我們自己使用java.net.HttpURLConnection來(lái)搞定這些問(wèn)題是很恐怖的事情,因此在開(kāi)始之前我們先要介紹一下一個(gè)開(kāi)放源碼的項(xiàng)目,這個(gè)項(xiàng)目就是Apache開(kāi)源組織中的httpclient,它隸屬于Jakarta的commons項(xiàng)目,目前的版本是2.0RC2。commons下本來(lái)已經(jīng)有一個(gè)net的子項(xiàng)目,但是又把httpclient單獨(dú)提出來(lái),可見(jiàn)http服務(wù)器的訪問(wèn)絕非易事。

    Commons-httpclient項(xiàng)目就是專門設(shè)計(jì)來(lái)簡(jiǎn)化HTTP客戶端與服務(wù)器進(jìn)行各種通訊編程。通過(guò)它可以讓原來(lái)很頭疼的事情現(xiàn)在輕松的解決,例如你不再管是HTTP或者HTTPS的通訊方式,告訴它你想使用HTTPS方式,剩下的事情交給httpclient替你完成。本文會(huì)針對(duì)我們?cè)诰帉慔TTP客戶端程序時(shí)經(jīng)常碰到的幾個(gè)問(wèn)題進(jìn)行分別介紹如何使用httpclient來(lái)解決它們,為了讓讀者更快的熟悉這個(gè)項(xiàng)目我們最開(kāi)始先給出一個(gè)簡(jiǎn)單的例子來(lái)讀取一個(gè)網(wǎng)頁(yè)的內(nèi)容,然后循序漸進(jìn)解決掉前進(jìn)中的所有問(wèn)題。

    1. 讀取網(wǎng)頁(yè)(HTTP/HTTPS)內(nèi)容

    下面是我們給出的一個(gè)簡(jiǎn)單的例子用來(lái)訪問(wèn)某個(gè)頁(yè)面

    /*
    * Created on 2003-12-14 by Liudong
    */

     

    package http.demo;
    import java.io.IOException;
    import org.apache.commons.httpclient.*;
    import org.apache.commons.httpclient.methods.*;

     

    /** 
     *最簡(jiǎn)單的HTTP客戶端,用來(lái)演示通過(guò)GET或者POST方式訪問(wèn)某個(gè)頁(yè)面
      *@authorLiudong
    */

     

     

    public class SimpleClient {
    public static void main(String[] args) throws IOException
    {
      HttpClient client = new HttpClient();
          // 設(shè)置代理服務(wù)器地址和端口      

          //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port); 
         
    // 使用 GET 方法 ,如果服務(wù)器需要通過(guò) HTTPS 連接,那只需要將下面 URL 中的 http 換成 https
             HttpMethodmethod=newGetMethod("http://java.sun.com");
          //使用POST方法
          //HttpMethod method = new PostMethod("http://java.sun.com");
          
    client.executeMethod(method);

          
    //打印服務(wù)器返回的狀態(tài)
          
    System.out.println(method.getStatusLine());
          
    //打印返回的信息
          
    System.out.println(method.getResponseBodyAsString());
          
    //釋放連接
          
    method.releaseConnection();
       
    }
    }

     

    在這個(gè)例子中首先創(chuàng)建一個(gè)HTTP客戶端(HttpClient)的實(shí)例,然后選擇提交的方法是GET或者POST,最后在HttpClient實(shí)例上執(zhí)行提交的方法,最后從所選擇的提交方法中讀取服務(wù)器反饋回來(lái)的結(jié)果。這就是使用HttpClient的基本流程。其實(shí)用一行代碼也就可以搞定整個(gè)請(qǐng)求的過(guò)程,非常的簡(jiǎn)單!


    2. 以GET或者POST方式向網(wǎng)頁(yè)提交參數(shù)

    其實(shí)前面一個(gè)最簡(jiǎn)單的示例中我們已經(jīng)介紹了如何使用GET或者POST方式來(lái)請(qǐng)求一個(gè)頁(yè)面,本小節(jié)與之不同的是多了提交時(shí)設(shè)定頁(yè)面所需的參數(shù),我們知道如果是GET的請(qǐng)求方式,那么所有參數(shù)都直接放到頁(yè)面的URL后面用問(wèn)號(hào)與頁(yè)面地址隔開(kāi),每個(gè)參數(shù)用&隔開(kāi),例如:http://java.sun.com/?name=liudong&mobile=123456,但是當(dāng)使用POST方法時(shí)就會(huì)稍微有一點(diǎn)點(diǎn)麻煩。本小節(jié)的例子演示向如何查詢手機(jī)號(hào)碼所在的城市,代碼如下:

     

    /*
    * Created on 2003-12-7 by Liudong 
    */

     

     

    package http.demo;
    import java.io.IOException;
    import org.apache.commons.httpclient.*;
    import org.apache.commons.httpclient.methods.*;

     

    /** 
     *提交參數(shù)演示
     *該程序連接到一個(gè)用于查詢手機(jī)號(hào)碼所屬地的頁(yè)面
     *以便查詢號(hào)碼段1330227所在的省份以及城市
     *@authorLiudong
     */

     

     

    public class SimpleHttpClient { 
       public static void main(String[] args) throws IOException {
          HttpClient client = new HttpClient();
          client.getHostConfiguration().setHost( "www.imobile.com.cn" , 80, "http" );
          method = getPostMethod();    // 使用 POST 方式提交數(shù)據(jù) 
          client.executeMethod(method);   //打印服務(wù)器返回的狀態(tài) 
          System.out.println(method.getStatusLine());   //打印結(jié)果頁(yè)面
          Stringresponse=newString(method.getResponseBodyAsString().getBytes("8859_1"));

          //打印返回的信息
          System.out.println(response);
          method.releaseConnection();
       }

     

     

       /** 
        * 使用 GET 方式提交數(shù)據(jù) 
        *@return 
        */

       privatestaticHttpMethodgetGetMethod(){
          returnnewGetMethod("/simcard.php?simcard=1330227");
       }

     

     

        /** 
         * 使用 POST 方式提交數(shù)據(jù) 
         *@return 
         */

     

     

        private static HttpMethod getPostMethod(){
          PostMethod post = new PostMethod( "/simcard.php" );
          NameValuePair simcard = new NameValuePair( "simcard" , "1330227" );
          post.setRequestBody( new NameValuePair[] { simcard});
          return post;
       }

    }

    在上面的例子中頁(yè)面http://www.imobile.com.cn/simcard.php需要一個(gè)參數(shù)是simcard,這個(gè)參數(shù)值為手機(jī)號(hào)碼段,即手機(jī)號(hào)碼的前七位,服務(wù)器會(huì)返回提交的手機(jī)號(hào)碼對(duì)應(yīng)的省份、城市以及其他詳細(xì)信息。GET的提交方法只需要在URL后加入?yún)?shù)信息,而POST則需要通過(guò)NameValuePair類來(lái)設(shè)置參數(shù)名稱和它所對(duì)應(yīng)的值。

    3. 處理頁(yè)面重定向

    在JSP/Servlet編程中response.sendRedirect方法就是使用HTTP協(xié)議中的重定向機(jī)制。它與JSP中的<jsp:forward …>的區(qū)別在于后者是在服務(wù)器中實(shí)現(xiàn)頁(yè)面的跳轉(zhuǎn),也就是說(shuō)應(yīng)用容器加載了所要跳轉(zhuǎn)的頁(yè)面的內(nèi)容并返回給客戶端;而前者是返回一個(gè)狀態(tài)碼,這些狀態(tài)碼的可能值見(jiàn)下表,然后客戶端讀取需要跳轉(zhuǎn)到的頁(yè)面的URL并重新加載新的頁(yè)面。就是這樣一個(gè)過(guò)程,所以我們編程的時(shí)候就要通過(guò)HttpMethod.getStatusCode()方法判斷返回值是否為下表中的某個(gè)值來(lái)判斷是否需要跳轉(zhuǎn)。如果已經(jīng)確認(rèn)需要進(jìn)行頁(yè)面跳轉(zhuǎn)了,那么可以通過(guò)讀取HTTP頭中的location屬性來(lái)獲取新的地址。

    狀態(tài)碼

     

    對(duì)應(yīng) HttpServletResponse 的常量

     

    詳細(xì)描述

     

    301

     

     

    SC_MOVED_PERMANENTLY

     

     

    頁(yè)面已經(jīng)永久移到另外一個(gè)新地址

     

    302

     

     

    SC_MOVED_TEMPORARILY

     

     

    頁(yè)面暫時(shí)移動(dòng)到另外一個(gè)新的地址

     

    303

     

     

    SC_SEE_OTHER

     

     

    客戶端請(qǐng)求的地址必須通過(guò)另外的 URL 來(lái)訪問(wèn)

     

    307

     

     

    SC_TEMPORARY_REDIRECT

     

     

    SC_MOVED_TEMPORARILY

     

     

    下面的代碼片段演示如何處理頁(yè)面的重定向

    client.executeMethod(post);
    System.out.println(post.getStatusLine().toString());
    post.releaseConnection();
    // 檢查是否重定向
    int statuscode = post.getStatusCode();
    if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) || (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) || (statuscode == HttpStatus.SC_SEE_OTHER) || (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
    // 讀取新的 URL 地址 
       Headerheader=post.getResponseHeader("location");
       if (header!=null){
          Stringnewuri=header.getValue();
          if((newuri==null)||(newuri.equals("")))
             newuri="/";
             GetMethodredirect=newGetMethod(newuri);
             client.executeMethod(redirect);
             System.out.println("Redirect:"+redirect.getStatusLine().toString());
             redirect.releaseConnection();
       }else 
        System.out.println("Invalid redirect");
    }

    我們可以自行編寫兩個(gè)JSP頁(yè)面,其中一個(gè)頁(yè)面用response.sendRedirect方法重定向到另外一個(gè)頁(yè)面用來(lái)測(cè)試上面的例子。

    4. 模擬輸入用戶名和口令進(jìn)行登錄

    本小節(jié)應(yīng)該說(shuō)是HTTP客戶端編程中最常碰見(jiàn)的問(wèn)題,很多網(wǎng)站的內(nèi)容都只是對(duì)注冊(cè)用戶可見(jiàn)的,這種情況下就必須要求使用正確的用戶名和口令登錄成功后,方可瀏覽到想要的頁(yè)面。因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,也就是連接的有效期只限于當(dāng)前請(qǐng)求,請(qǐng)求內(nèi)容結(jié)束后連接就關(guān)閉了。在這種情況下為了保存用戶的登錄信息必須使用到Cookie機(jī)制。以JSP/Servlet為例,當(dāng)瀏覽器請(qǐng)求一個(gè)JSP或者是Servlet的頁(yè)面時(shí),應(yīng)用服務(wù)器會(huì)返回一個(gè)參數(shù),名為jsessionid(因不同應(yīng)用服務(wù)器而異),值是一個(gè)較長(zhǎng)的唯一字符串的Cookie,這個(gè)字符串值也就是當(dāng)前訪問(wèn)該站點(diǎn)的會(huì)話標(biāo)識(shí)。瀏覽器在每訪問(wèn)該站點(diǎn)的其他頁(yè)面時(shí)候都要帶上jsessionid這樣的Cookie信息,應(yīng)用服務(wù)器根據(jù)讀取這個(gè)會(huì)話標(biāo)識(shí)來(lái)獲取對(duì)應(yīng)的會(huì)話信息。

    對(duì)于需要用戶登錄的網(wǎng)站,一般在用戶登錄成功后會(huì)將用戶資料保存在服務(wù)器的會(huì)話中,這樣當(dāng)訪問(wèn)到其他的頁(yè)面時(shí)候,應(yīng)用服務(wù)器根據(jù)瀏覽器送上的Cookie中讀取當(dāng)前請(qǐng)求對(duì)應(yīng)的會(huì)話標(biāo)識(shí)以獲得對(duì)應(yīng)的會(huì)話信息,然后就可以判斷用戶資料是否存在于會(huì)話信息中,如果存在則允許訪問(wèn)頁(yè)面,否則跳轉(zhuǎn)到登錄頁(yè)面中要求用戶輸入帳號(hào)和口令進(jìn)行登錄。這就是一般使用JSP開(kāi)發(fā)網(wǎng)站在處理用戶登錄的比較通用的方法。

    這樣一來(lái),對(duì)于HTTP的客戶端來(lái)講,如果要訪問(wèn)一個(gè)受保護(hù)的頁(yè)面時(shí)就必須模擬瀏覽器所做的工作,首先就是請(qǐng)求登錄頁(yè)面,然后讀取Cookie值;再次請(qǐng)求登錄頁(yè)面并加入登錄頁(yè)所需的每個(gè)參數(shù);最后就是請(qǐng)求最終所需的頁(yè)面。當(dāng)然在除第一次請(qǐng)求外其他的請(qǐng)求都需要附帶上Cookie信息以便服務(wù)器能判斷當(dāng)前請(qǐng)求是否已經(jīng)通過(guò)驗(yàn)證。說(shuō)了這么多,可是如果你使用httpclient的話,你甚至連一行代碼都無(wú)需增加,你只需要先傳遞登錄信息執(zhí)行登錄過(guò)程,然后直接訪問(wèn)想要的頁(yè)面,跟訪問(wèn)一個(gè)普通的頁(yè)面沒(méi)有任何區(qū)別,因?yàn)轭怘ttpClient已經(jīng)幫你做了所有該做的事情了,太棒了!下面的例子實(shí)現(xiàn)了這樣一個(gè)訪問(wèn)的過(guò)程。

    /*
    * Created on 2003-12-7 by Liudong
    */

     

    package http.demo;
    import org.apache.commons.httpclient.*;
    import org.apache.commons.httpclient.cookie.*;
    import org.apache.commons.httpclient.methods.*;

    /**
     * 用來(lái)演示登錄表單的示例
     * @author Liudong
     */

     

    public class FormLoginDemo {
       static final String LOGON_SITE = "localhost" ;
       static final int     LOGON_PORT = 8080;

       public static void main(String[] args) throws Exception{
          HttpClient client = new HttpClient();
          client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);

          // 模擬登錄頁(yè)面 login.jsp->main.jsp
          PostMethod post = new PostMethod( "/main.jsp" );
          NameValuePair name = new NameValuePair( "name" , "ld" );
          NameValuePair pass = new NameValuePair( "password" , "ld" );
          post.setRequestBody( new NameValuePair[]{name,pass});
          int status = client.executeMethod(post);
          System.out.println(post.getResponseBodyAsString());
          post.releaseConnection();

          // 查看 cookie 信息
          CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
          Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/" , false , client.getState().getCookies());
          if (cookies.length == 0) {
             System.out.println( "None" );
          } else {
             for ( int i = 0; i < cookies.length; i++) {
                System.out.println(cookies[i].toString());
             }
          }

          // 訪問(wèn)所需的頁(yè)面 main2.jsp 
          GetMethodget=newGetMethod("/main2.jsp");
          client.executeMethod(get);
          System.out.println(get.getResponseBodyAsString());
          get.releaseConnection();
       }
    }

    5. 提交XML格式參數(shù)

    提交XML格式的參數(shù)很簡(jiǎn)單,僅僅是一個(gè)提交時(shí)候的ContentType問(wèn)題,下面的例子演示從文件文件中讀取XML信息并提交給服務(wù)器的過(guò)程,該過(guò)程可以用來(lái)測(cè)試Web服務(wù)。

    import java.io.File;
    import java.io.FileInputStream;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
    import org.apache.commons.httpclient.methods.PostMethod;

     

     

    /** 
     *用來(lái)演示提交XML格式數(shù)據(jù)的例子
    */

     

     

    public class PostXMLClient {

       public
    static void main(String[] args) throws Exception {
          File input = new File(“test.xml”);
          PostMethod post = new PostMethod(“http://localhost:8080/httpclient/xml.jsp”);

          // 設(shè)置請(qǐng)求的內(nèi)容直接從文件中讀取
          post.setRequestBody( new FileInputStream(input)); 
          if (input.length() < Integer.MAX_VALUE)
             post.setRequestContentLength(input.length());
          else
             post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);

          // 指定請(qǐng)求內(nèi)容的類型
          post.setRequestHeader( "Content-type" , "text/xml; charset=GBK" );
          HttpClient httpclient = new HttpClient();
          int result = httpclient.executeMethod(post);
          System.out.println( "Response status code: " + result);
          System.out.println( "Response body: " );
          System.out.println(post.getResponseBodyAsString()); 
          post.releaseConnection(); 
       }
    }

    6. 通過(guò)HTTP上傳文件

    httpclient使用了單獨(dú)的一個(gè)HttpMethod子類來(lái)處理文件的上傳,這個(gè)類就是MultipartPostMethod,該類已經(jīng)封裝了文件上傳的細(xì)節(jié),我們要做的僅僅是告訴它我們要上傳文件的全路徑即可,下面的代碼片段演示如何使用這個(gè)類。

    MultipartPostMethod filePost = new MultipartPostMethod(targetURL);
    filePost.addParameter( "fileName" , targetFilePath);
    HttpClient client = new HttpClient();

     

    // 由于要上傳的文件可能比較大 , 因此在此設(shè)置最大的連接超時(shí)時(shí)間
    client.getHttpConnectionManager(). getParams().setConnectionTimeout(5000);
    int status = client.executeMethod(filePost);

    上面代碼中,targetFilePath即為要上傳的文件所在的路徑。

    7. 訪問(wèn)啟用認(rèn)證的頁(yè)面

    我們經(jīng)常會(huì)碰到這樣的頁(yè)面,當(dāng)訪問(wèn)它的時(shí)候會(huì)彈出一個(gè)瀏覽器的對(duì)話框要求輸入用戶名和密碼后方可,這種用戶認(rèn)證的方式不同于我們?cè)谇懊娼榻B的基于表單的用戶身份驗(yàn)證。這是HTTP的認(rèn)證策略,httpclient支持三種認(rèn)證方式包括:基本、摘要以及NTLM認(rèn)證。其中基本認(rèn)證最簡(jiǎn)單、通用但也最不安全;摘要認(rèn)證是在HTTP 1.1中加入的認(rèn)證方式,而NTLM則是微軟公司定義的而不是通用的規(guī)范,最新版本的NTLM是比摘要認(rèn)證還要安全的一種方式。

    下面例子是從httpclient的CVS服務(wù)器中下載的,它簡(jiǎn)單演示如何訪問(wèn)一個(gè)認(rèn)證保護(hù)的頁(yè)面:

    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.UsernamePasswordCredentials;
    import org.apache.commons.httpclient.methods.GetMethod;

    public class BasicAuthenticationExample { 

       public BasicAuthenticationExample() { 
       }

       public static void main(String[] args) throws Exception {
          HttpClient client = new HttpClient();
          client.getState().setCredentials( "www.verisign.com" , "realm" , new UsernamePasswordCredentials( "username" , "password" ) );

          GetMethod get = new GetMethod( "https://www.verisign.com/products/index.html" );
          get.setDoAuthentication( true );
          int status = client.executeMethod( get );
          System.out.println(status+ "\n" + get.getResponseBodyAsString());
          get.releaseConnection();
       }
    }

    8. 多線程模式下使用httpclient

    多線程同時(shí)訪問(wèn)httpclient,例如同時(shí)從一個(gè)站點(diǎn)上下載多個(gè)文件。對(duì)于同一個(gè)HttpConnection同一個(gè)時(shí)間只能有一個(gè)線程訪問(wèn),為了保證多線程工作環(huán)境下不產(chǎn)生沖突,httpclient使用了一個(gè)多線程連接管理器的類:MultiThreadedHttpConnectionManager,要使用這個(gè)類很簡(jiǎn)單,只需要在構(gòu)造HttpClient實(shí)例的時(shí)候傳入即可,代碼如下:

    MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();

     

    HttpClient client = new HttpClient(connectionManager);

    以后盡管訪問(wèn)client實(shí)例即可。

    參考資料:

    httpclient首頁(yè):    http://jakarta.apache.org/commons/httpclient/
    關(guān)于NTLM是如何工作:  http://davenport.sourceforge.net/ntlm.html


    --------------------------------------------

    HttpClient入門
    http://blog.csdn.net/ambitiontan/archive/2006/01/07/572644.aspx

    Jakarta Commons HttpClient 學(xué)習(xí)筆記
    http://blog.csdn.net/cxl34/archive/2005/01/19/259051.aspx

    Cookies,SSL,httpclient的多線程處理,HTTP方法
    http://blog.csdn.net/bjbs_270/archive/2004/11/05/168233.aspx

    阿里云服務(wù)器優(yōu)惠券
    posted on 2007-01-22 09:39 Alpha 閱讀(143518) 評(píng)論(44)  編輯  收藏 所屬分類: Java J2EE JSP

    評(píng)論:
    # re: HttpClient 學(xué)習(xí)整理 2007-01-23 14:54 | 壞男孩
    這個(gè)是不是在AJAX里面用的多一些啊  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2007-10-23 08:55 | 信鴿
    真叫高,學(xué)習(xí)了,。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2007-11-22 11:33 | Hamly
    不錯(cuò),謝謝!  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2008-01-14 14:26 | java綜合網(wǎng)
    # re: HttpClient 學(xué)習(xí)整理 2008-01-21 11:25 | 繼續(xù)努力
    很好,很強(qiáng)大。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2008-04-28 10:33 | henry1451
    確實(shí)不錯(cuò),學(xué)習(xí)了.  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2008-12-08 10:09 | ningyougang
    呵呵,學(xué)習(xí)了,真的很不錯(cuò)  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2008-12-11 10:11 | jhf
    很不錯(cuò),很受益  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2009-02-18 17:49 | greathjt
    佩服,佩服,很強(qiáng)很好,很強(qiáng)大  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2009-07-22 16:02 | 波波^_^
    不錯(cuò),很牛!  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2009-10-21 10:16 | 林斌
    真的不錯(cuò)哎。簡(jiǎn)明易懂。受教了。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2009-12-17 15:41 | uytu
    tyuytutyutyutyutyu  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2010-07-22 09:29 | ll
    Very good!  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2010-07-22 23:59 | java程序員
    寫的不錯(cuò),受用了,希望樓主繼續(xù)努力。。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2011-04-23 09:42 | 潤(rùn)
    請(qǐng)問(wèn)這個(gè)連接 是怎么知道的? 比如獲取號(hào)碼歸屬地:www.imobile.com.cn這個(gè)可以知道,但是這個(gè)是怎么來(lái)的?/simcard.php  回復(fù)  更多評(píng)論
      
    # test 2011-05-09 18:57 | est
    xxxxxxxxxxxxxxxxx  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2011-05-31 10:16 | 小盆友
    給力。這個(gè)總結(jié)的太好了。一看就懂  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2011-10-02 09:11 | callmegod
    非常感謝,剛好要用它,呵呵
    順便轉(zhuǎn)載到我的博客存起以備用,已注明轉(zhuǎn)載
    如果有不當(dāng)之處,望告知我刪除,呵呵  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2011-11-03 17:34 | sam
    @潤(rùn)
    用抓包工具去分析  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2011-12-14 09:18 | qq
    不錯(cuò)很好  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2011-12-30 14:49 | 程序員之家
    先支持一下在學(xué)習(xí)  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2012-02-27 15:47 | roider
    您好,文章很不錯(cuò),我有一個(gè)問(wèn)題,在使用時(shí),我想知道我上傳文件信息的大小,我看到MultipartEntity類中有一個(gè)getContentLength,可是使用該方法后,返回的是-1,是什么原因呢?我確定我的MultipartEntity中有東西存在的。如能回復(fù)不勝感激。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2012-03-24 12:40 | chenwei
    多謝,看到這,下午就有事情可以了  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2012-05-14 10:11 | a
    文件放在web-inf下上傳過(guò)去會(huì)有問(wèn)題的吧?  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2012-05-23 18:16 |
    學(xué)習(xí)了,原來(lái)樓主還是Beyond歌迷。。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2012-08-10 10:36 | NB
    HttpClient client = new HttpClient();
    。。。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2012-11-28 19:31 | timelyxyz
    正在學(xué)習(xí),謝過(guò)了  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2012-11-29 15:59 | JL
    帖子內(nèi)容很好,知識(shí)點(diǎn)很全面,但就是中間有些小瑕疵,有些地方代碼有誤,eg:
    Stringresponse=newString(method.getResponseBodyAsString().getBytes("8859_1"));  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2012-12-28 09:22 | 駿
    請(qǐng)問(wèn)這些代碼用導(dǎo)入jar包嗎?是哪些包,請(qǐng)?zhí)峁┫螺d地址好嗎?急用  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2013-01-09 17:22 | aunt
    @潤(rùn)
    當(dāng)然是你上網(wǎng)搜的了  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2013-03-03 21:27 | 文晶
    不錯(cuò)學(xué)習(xí)了  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2013-03-21 15:08 | 123
    非常受用的說(shuō)!  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2013-05-21 15:50 | feiyinglm
    非常感謝!解決了我的實(shí)際問(wèn)題~  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2013-07-10 17:45 | zhang
    我參考寫的貌似數(shù)據(jù)不能真正傳過(guò)去啊?是什么原因呢?求解??  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2013-09-22 23:29 | wilhard
    終于知道httpclient為何物了。學(xué)基本的看別人博客,學(xué)高深點(diǎn)或者出問(wèn)題的時(shí)候去看官網(wǎng),不知道這樣的學(xué)習(xí)方式好不好。  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2013-10-24 17:41 | 額問(wèn)問(wèn)
    @wilhard
    @wilhard
    @wilhard
    很好  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2013-10-31 17:15 | 圓頂df
    # re: HttpClient 學(xué)習(xí)整理 2013-12-20 11:01 | 何陶
    文字概括的很到位,很受用  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2014-04-14 10:05 | 鄒淑含
    # re: HttpClient 學(xué)習(xí)整理[未登錄](méi) 2014-07-26 00:37 | abc
    學(xué)習(xí)了,感謝樓主分享!  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2014-09-27 15:02 | Idiot
    謝謝分享  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2014-12-03 14:55 | rain1201
    贊一個(gè)  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2015-06-29 11:11 | yaj
    請(qǐng)問(wèn)下HTTPCLIENT怎么綁定客戶端的IP?  回復(fù)  更多評(píng)論
      
    # re: HttpClient 學(xué)習(xí)整理 2015-08-20 17:51 | 李志偉
    受教了  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 久久久久亚洲精品成人网小说| 麻豆精品成人免费国产片| 国产青草视频免费观看97 | 亚洲日韩在线观看免费视频| 国产伦一区二区三区免费 | 免费人成无码大片在线观看| 日本亚洲中午字幕乱码| 国产在线不卡免费播放| 亚洲av无码专区在线观看下载 | 亚洲国产成人超福利久久精品| 国产妇乱子伦视频免费| 亚洲一区电影在线观看| 国产va免费精品观看精品| 亚洲人xxx日本人18| 成人最新午夜免费视频| 亚洲国产综合AV在线观看| 国产免费看插插插视频| 男女猛烈激情xx00免费视频| 国产精品亚洲综合专区片高清久久久| 羞羞视频免费网站入口| 久久精品国产亚洲精品| 成在人线av无码免费高潮喷水| 久久亚洲AV午夜福利精品一区 | 亚洲AV无码成人精品区蜜桃| 99视频在线免费看| 亚洲手机中文字幕| 成人爽A毛片免费看| 国产精品亚洲二区在线| 亚洲一级Av无码毛片久久精品| a级在线免费观看| 中文字幕在线观看亚洲| 在线a级毛片免费视频| 亚洲国产成人精品无码区二本 | 久久精品国产亚洲一区二区| 97精品免费视频| 久久亚洲国产成人影院| 免费看国产精品麻豆| 中文字幕无码毛片免费看 | igao激情在线视频免费| 亚洲人成网站在线播放影院在线 | 免费高清A级毛片在线播放|