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

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

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

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
    第六章 高級主題

    6.1 自定義客戶端連接

    在特定條件下,也許需要來定制HTTP報文通過線路傳遞,越過了可能使用的HTTP參數(shù)來處理非標(biāo)準(zhǔn)不兼容行為的方式。比如,對于Web爬蟲,它可能需要強制HttpClient接受格式錯誤的響應(yīng)頭部信息,來搶救報文的內(nèi)容。

    通常插入一個自定義的報文解析器的過程或定制連接實現(xiàn)需要幾個步驟:

    提供一個自定義LineParser/LineFormatter接口實現(xiàn)。如果需要,實現(xiàn)報文解析/格式化邏輯。

    class MyLineParser extends BasicLineParser {
    @Override
    public Header parseHeader(
    final CharArrayBuffer buffer) throws ParseException {
    try {
    return super.parseHeader(buffer);
    } catch (ParseException ex) {
    // 壓制ParseException異常
    return new BasicHeader("invalid", buffer.toString());
    }
    }
    }

    提過一個自定義的OperatedClientConnection實現(xiàn)。替換需要自定義的默認請求/響應(yīng)解析器,請求/響應(yīng)格式化器。如果需要,實現(xiàn)不同的報文寫入/讀取代碼。

    class MyClientConnection extends DefaultClientConnection {
    @Override
    protected HttpMessageParser createResponseParser(
    final SessionInputBuffer buffer,
    final HttpResponseFactory responseFactory,
    final HttpParams params) {
    return new DefaultResponseParser(buffer,
    new MyLineParser(),responseFactory,params);
    }
    }

    為了創(chuàng)建新類的連接,提供一個自定義的ClientConnectionOperator接口實現(xiàn)。如果需要,實現(xiàn)不同的套接字初始化代碼。

    class MyClientConnectionOperator extends
    DefaultClientConnectionOperator {
    public MyClientConnectionOperator(
    final SchemeRegistry sr) {
    super(sr);
    }
    @Override
    public OperatedClientConnection createConnection() {
    return new MyClientConnection();
    }
    }

    為了創(chuàng)建新類的連接操作,提供自定義的ClientConnectionManager接口實現(xiàn)。

    class MyClientConnManager extends SingleClientConnManager {
    public MyClientConnManager(
    final HttpParams params,
    final SchemeRegistry sr) {
    super(params, sr);
    }
    @Override
    protected ClientConnectionOperator createConnectionOperator(
    final SchemeRegistry sr) {
    return new MyClientConnectionOperator(sr);
    }
    }

    6.2 有狀態(tài)的HTTP連接

    HTTP規(guī)范假設(shè)session狀態(tài)信息通常是以HTTP cookie格式嵌入在HTTP報文中的,因此HTTP連接通常是無狀態(tài)的,這個假設(shè)在現(xiàn)實生活中通常是不對的。也有一些情況,當(dāng)HTTP連接使用特定的用戶標(biāo)識或特定的安全上下文來創(chuàng)建時,因此不能和其它用戶共享,只能由該用戶重用。這樣的有狀態(tài)的HTTP連接的示例就是NTLM認證連接和使用客戶端證書認證的SSL連接。

    6.2.1 用戶令牌處理器

    HttpClient依賴UserTokenHandler接口來決定給定的執(zhí)行上下文是否是用戶指定的。如果這個上下文是用戶指定的或者如果上下文沒有包含任何資源或關(guān)于當(dāng)前用戶指定詳情而是null,令牌對象由這個處理器返回,期望唯一地標(biāo)識當(dāng)前的用戶。用戶令牌將被用來保證用戶指定資源不會和其它用戶來共享或重用。

    如果它可以從給定的執(zhí)行上下文中來獲得,UserTokenHandler接口的默認實現(xiàn)是使用主類的一個實例來代表HTTP連接的狀態(tài)對象。UserTokenHandler將會使用基于如NTLM或開啟的客戶端認證SSL會話認證模式的用戶的主連接。如果二者都不可用,那么就不會返回令牌。

    如果默認的不能滿足它們的需要,用戶可以提供一個自定義的實現(xiàn):
    DefaultHttpClient httpclient = new DefaultHttpClient();
    httpclient.setUserTokenHandler(new UserTokenHandler() {
    public Object getUserToken(HttpContext context) {
    return context.getAttribute("my-token");
    }
    });

    6.2.2 用戶令牌和執(zhí)行上下文

    在HTTP請求執(zhí)行的過程中,HttpClient添加了下列和用戶標(biāo)識相關(guān)的對象到執(zhí)行上下文中:

    'http.user-token':對象實例代表真實的用戶標(biāo)識,通常期望Principle接口的實例。

    我們可以在請求被執(zhí)行后,通過檢查本地HTTP上下文的內(nèi)容,發(fā)現(xiàn)是否用于執(zhí)行請求的連接是有狀態(tài)的。
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpGet httpget = new HttpGet("http://localhost:8080/");
    HttpResponse response = httpclient.execute(httpget, localContext);
    HttpEntity entity = response.getEntity();
    if (entity != null) {
    entity.consumeContent();
    }
    Object userToken = localContext.getAttribute(ClientContext.USER_TOKEN);
    System.out.println(userToken);
    6.2.2.1 持久化有狀態(tài)的連接
    請注意帶有狀態(tài)對象的持久化連接僅當(dāng)請求被執(zhí)行時,相同狀態(tài)對象被綁定到執(zhí)行上下文時可以被重用。所以,保證相同上下文重用于執(zhí)行隨后的相同用戶,或用戶令牌綁定到之前請求執(zhí)行上下文的HTTP請求是很重要的。
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpContext localContext1 = new BasicHttpContext();
    HttpGet httpget1 = new HttpGet("http://localhost:8080/");
    HttpResponse response1 = httpclient.execute(httpget1, localContext1);
    HttpEntity entity1 = response1.getEntity();
    if (entity1 != null) {
    entity1.consumeContent();
    }
    Principal principal = (Principal) localContext1.getAttribute(
    ClientContext.USER_TOKEN);
    HttpContext localContext2 = new BasicHttpContext();
    localContext2.setAttribute(ClientContext.USER_TOKEN, principal);
    HttpGet httpget2 = new HttpGet("http://localhost:8080/");
    HttpResponse response2 = httpclient.execute(httpget2, localContext2);
    HttpEntity entity2 = response2.getEntity();
    if (entity2 != null) {
    entity2.consumeContent();
    }

    轉(zhuǎn)載自:http://www.cnblogs.com/loveyakamoz/archive/2011/07/21/2113251.html
    posted on 2012-09-26 16:45 abin 閱讀(801) 評論(0)  編輯  收藏 所屬分類: httpClient
    主站蜘蛛池模板: 国产精品免费电影| 久久精品乱子伦免费| 亚洲成熟丰满熟妇高潮XXXXX| 亚洲春色另类小说| 亚洲成人午夜电影| 亚洲国产一区在线观看| 亚洲精品视频久久| 亚洲国产成人91精品| 亚洲一级毛片视频| 亚洲区日韩精品中文字幕| 亚洲欧美熟妇综合久久久久| 亚洲日韩精品无码专区加勒比☆| 国产成人亚洲综合网站不卡| 美女视频黄免费亚洲| 亚洲精品无码专区在线播放| 噜噜综合亚洲AV中文无码| 免费人成再在线观看网站| 一级日本高清视频免费观看| 中文字幕无线码中文字幕免费| a毛片在线还看免费网站| 无码国产精品一区二区免费vr| 亚洲一级毛片免费看| 国产大片线上免费观看| 在线精品免费视频| 亚洲乱码日产精品a级毛片久久| 亚洲日韩人妻第一页| 久久精品国产亚洲AV麻豆王友容| 亚洲酒色1314狠狠做| 亚洲色无码专区一区| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 一级美国片免费看| 曰批全过程免费视频在线观看无码 | 亚洲熟妇久久精品| 国产亚洲午夜精品| 精品熟女少妇aⅴ免费久久 | 亚洲GV天堂无码男同在线观看| 黄色a三级三级三级免费看| 日本高清不卡aⅴ免费网站| 18勿入网站免费永久| 免费在线观看一级毛片| 亚洲Av无码专区国产乱码DVD|