<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
    第三章 HTTP狀態(tài)管理

    原始的HTTP是被設(shè)計為無狀態(tài)的,面向請求/響應(yīng)的協(xié)議,沒有特殊規(guī)定有狀態(tài)的,貫穿一些邏輯相關(guān)的請求/響應(yīng)交換的會話。由于HTTP協(xié)議變得越來越普及和受歡迎,越來越多的從前沒有打算使用它的系統(tǒng)也開始為應(yīng)用程序來使用它,比如作為電子商務(wù)應(yīng)用程序的傳輸方式。因此,支持狀態(tài)管理就變得非常必要了。

    網(wǎng)景公司,一度成為Web客戶端和服務(wù)器軟件開發(fā)者的領(lǐng)導(dǎo)方向,在它們基于專有規(guī)范的產(chǎn)品中實現(xiàn)了對HTTP狀態(tài)管理的支持。之后,網(wǎng)景公司試圖通過發(fā)布規(guī)范草案來規(guī)范這種機(jī)制。它們的努力通過RFC標(biāo)準(zhǔn)跟蹤促成了這些規(guī)范定義。然而,在很多應(yīng)用程序中的狀態(tài)管理仍然基于網(wǎng)景公司的草案而不兼容官方的規(guī)范。很多主要的Web瀏覽器開發(fā)者覺得有必要保留那些極大促進(jìn)標(biāo)準(zhǔn)片段應(yīng)用程序的兼容性。

    3.1 HTTP cookies

    Cookie是HTTP代理和目標(biāo)服務(wù)器可以交流保持會話的狀態(tài)信息的令牌或短包。網(wǎng)景公司的工程師用它來指“魔法小甜餅”和粘住的名字。

    HttpClient使用Cookie接口來代表抽象的cookie令牌。在它的簡單形式中HTTP的cookie幾乎是名/值對。通常一個HTTP的cookie也包含一些屬性,比如版本號,合法的域名,指定cookie應(yīng)用所在的源服務(wù)器URL子集的路徑,cookie的最長有效時間。

    SetCookie接口代表由源服務(wù)器發(fā)送給HTTP代理的響應(yīng)中的頭部信息Set-Cookie來維持一個對話狀態(tài)。SetCookie2接口和指定的Set-Cookie2方法擴(kuò)展了SetCookie。

    SetCookie接口和額外的如獲取原始cookie屬性的能力,就像它們由源服務(wù)器指定的客戶端特定功能擴(kuò)展了Cookie接口。這對生成Cookie頭部很重要,因為一些cookie規(guī)范需要。Cookie頭部應(yīng)該包含在Set-Cookie或Set-Cookie2頭部中指定的特定屬性。

    3.1.1 Cookie版本

    Cookie兼容網(wǎng)景公司的草案標(biāo)準(zhǔn),但是版本0被認(rèn)為是不符合官方規(guī)范的。符合標(biāo)準(zhǔn)的cookie的期望版本是1。HttpClient可以處理基于不同版本的cookie。

    這里有一個重新創(chuàng)建網(wǎng)景公司草案cookie示例:

    BasicClientCookie netscapeCookie = new BasicClientCookie("name", "value");
    netscapeCookie.setVersion(0);
    netscapeCookie.setDomain(".mycompany.com");
    netscapeCookie.setPath("/");

    這是一個重新創(chuàng)建標(biāo)準(zhǔn)cookie的示例。要注意符合標(biāo)準(zhǔn)的cookie必須保留由源服務(wù)器發(fā)送的所有屬性:

    BasicClientCookie stdCookie = new BasicClientCookie("name", "value");
    stdCookie.setVersion(1);
    stdCookie.setDomain(".mycompany.com");
    stdCookie.setPath("/");
    stdCookie.setSecure(true);
    // 精確設(shè)置由服務(wù)器發(fā)送的屬性
    stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
    stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");

    這是一個重新創(chuàng)建Set-Cookie2兼容cookie的實例。要注意符合標(biāo)準(zhǔn)的cookie必須保留由源服務(wù)器發(fā)送的所有屬性:

    BasicClientCookie2 stdCookie = new BasicClientCookie2("name", "value");
    stdCookie.setVersion(1);
    stdCookie.setDomain(".mycompany.com");
    stdCookie.setPorts(new int[] {80,8080});
    stdCookie.setPath("/");
    stdCookie.setSecure(true);
    // 精確設(shè)置由服務(wù)器發(fā)送的屬性
    stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1");
    stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");
    stdCookie.setAttribute(ClientCookie.PORT_ATTR, "80,8080");

    3.2 Cookie規(guī)范

    CookieSpec接口代表了cookie管理的規(guī)范。Cookie管理規(guī)范希望如下幾點(diǎn):
    • 解析的Set-Cookie規(guī)則還有可選的Set-Cookie2頭部信息。
    • 驗證解析cookie的規(guī)則。
    • 格式化給定主機(jī)的Cookie頭部信息,原始端口和路徑。

    HttpClient附帶了一些CookieSpec的實現(xiàn):

    • 網(wǎng)景公司草案:這個規(guī)范符合由網(wǎng)景通訊發(fā)布的原始草案規(guī)范。應(yīng)當(dāng)避免,除非有絕對的必要去兼容遺留代碼。
    • RFC 2109:官方HTTP狀態(tài)管理規(guī)范并取代的老版本,被RFC 2965取代。
    • RFC 2965:官方HTTP狀態(tài)管理規(guī)范。
    • 瀏覽器兼容性:這個實現(xiàn)努力去密切模仿(mis)通用Web瀏覽器應(yīng)用程序的實現(xiàn)。比如微軟的Internet Explorer和Mozilla的FireFox瀏覽器。
    • 最佳匹配:’Meta’(元)cookie規(guī)范采用了一些基于又HTTP響應(yīng)發(fā)送的cookie格式的cookie策略。它基本上聚合了以上所有的實現(xiàn)到以一個類中。
    強(qiáng)烈建議使用Best Match策略,讓HttpClient在運(yùn)行時基于執(zhí)行上下文采用一些合適的兼容等級。

    3.3 HTTP cookie和狀態(tài)管理參數(shù)

    這些是用于定制HTTP狀態(tài)管理和獨(dú)立的cookie規(guī)范行為的參數(shù)。
    • 'http.protocol.cookie-datepatterns':定義了用于解析非標(biāo)準(zhǔn)的expires屬性的合法日期格式。只是對兼容不符合規(guī)定的,仍然使用網(wǎng)景公司草案定義的expires而不使用標(biāo)準(zhǔn)的max-age屬性服務(wù)器需要。這個參數(shù)期望得到一個java.util.Collection類型的值。集合元素必須是java.lang.String類型,來兼容java.text.SimpleDateFormat的語法。如果這個參數(shù)沒有被設(shè)置,那么默認(rèn)的選擇就是CookieSpec實現(xiàn)規(guī)范的值。要注意這個參數(shù)的應(yīng)用。
    • 'http.protocol.single-cookie-header':定義了是否cookie應(yīng)該強(qiáng)制到一個獨(dú)立的Cookie請求頭部信息中。否則,每個cookie就被當(dāng)作分離的Cookie頭部信息來格式化。這個參數(shù)期望得到一個java.lang.Boolean類型的值。如果這個參數(shù)沒有被設(shè)置,那么默認(rèn)的選擇就是CookieSpec實現(xiàn)規(guī)范的值。要注意這個參數(shù)僅僅嚴(yán)格應(yīng)用于cookie規(guī)范(RFC 2109和RFC 2965)。瀏覽器兼容性和網(wǎng)景公司草案策略將會放置所有的cookie到一個請求頭部信息中。
    • 'http.protocol.cookie-policy':定義了用于HTTP狀態(tài)管理的cookie規(guī)范的名字。這個參數(shù)期望得到一個java.lang.String類型的值。如果這個參數(shù)沒有被設(shè)置,那么合法的日期格式就是CookieSpec實現(xiàn)規(guī)范的值。

    3.4 Cookie規(guī)范注冊表

    HttpClient使用CookieSpecRegistry類維護(hù)一個可用的cookie規(guī)范注冊表。下面的規(guī)范對于每個默認(rèn)都是注冊過的:
    • 兼容性:瀏覽器兼容性(寬松策略)。
    • 網(wǎng)景:網(wǎng)景公司草案。
    • rfc2109:RFC 2109(過時的嚴(yán)格策略)。
    • rfc2965:RFC 2965(嚴(yán)格策略的標(biāo)準(zhǔn)符合)。
    • best-match:最佳匹配meta(元)策略。

    3.5 選擇cookie策略

    Cookie策略可以在HTTP客戶端被設(shè)置,如果需要,在HTTP請求級重寫。
    HttpClient httpclient = new DefaultHttpClient();
    // 對每個默認(rèn)的強(qiáng)制嚴(yán)格cookie策略
    httpclient.getParams().setParameter(
    ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2965);
    HttpGet httpget = new HttpGet("http://www.broken-server.com/");
    // 對這個請求覆蓋默認(rèn)策略
    httpget.getParams().setParameter(
    ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);

    3.6 定制cookie策略

    為了實現(xiàn)定制cookie策略,我們應(yīng)該創(chuàng)建CookieSpec接口的定制實現(xiàn)類,創(chuàng)建一個CookieSpecFactory實現(xiàn)來創(chuàng)建和初始化定制實現(xiàn)的實例并和HttpClient注冊這個工廠。一旦定制實現(xiàn)被注冊了,它可以和標(biāo)準(zhǔn)的cookie實現(xiàn)有相同的活性。
    CookieSpecFactory csf = new CookieSpecFactory() {
    public CookieSpec newInstance(HttpParams params) {
    return new BrowserCompatSpec() {
    @Override
    public void validate(Cookie cookie, CookieOrigin origin)
    throws MalformedCookieException {
    // 這相當(dāng)簡單
    }
    };
    }
    };
    DefaultHttpClient httpclient = new DefaultHttpClient();
    httpclient.getCookieSpecs().register("easy", csf);
    httpclient.getParams().setParameter(
    ClientPNames.COOKIE_POLICY, "easy");

    3.7 Cookie持久化

    HttpClient可以和任意物理表示的實現(xiàn)了CookieStore接口的持久化cookie存儲一起使用。默認(rèn)的CookieStore實現(xiàn)稱為BasicClientCookie,這是憑借java.util.ArrayList的一個簡單實現(xiàn)。在BasicClientCookie對象中存儲的cookie當(dāng)容器對象被垃圾回收機(jī)制回收時會丟失。如果需要,用戶可以提供更復(fù)雜的實現(xiàn)。
    DefaultHttpClient httpclient = new DefaultHttpClient();
    // 創(chuàng)建一個本地的cookie store實例
    CookieStore cookieStore = new MyCookieStore();
    // 如果需要填充cookie
    BasicClientCookie cookie = new BasicClientCookie("name", "value");
    cookie.setVersion(0);
    cookie.setDomain(".mycompany.com");
    cookie.setPath("/");
    cookieStore.addCookie(cookie);
    // 設(shè)置存儲
    httpclient.setCookieStore(cookieStore);

    3.8 HTTP狀態(tài)管理和執(zhí)行上下文

    在HTTP請求執(zhí)行的過程中,HttpClient添加了下列和狀態(tài)管理相關(guān)的對象到執(zhí)行上下文中:
    • 'http.cookiespec-registry':CookieSpecRegistry實例代表了實際的cookie規(guī)范注冊表。這個屬性的值設(shè)置在本地內(nèi)容中,優(yōu)先于默認(rèn)的。
    • 'http.cookie-spec':CookieSpec實例代表真實的cookie規(guī)范。
    • 'http.cookie-origin':CookieOrigin實例代表了真實的源服務(wù)器的詳細(xì)信息。
    • 'http.cookie-store':CookieStore實例代表了真實的cookie存儲。設(shè)置在本地內(nèi)容中的這個屬性的值優(yōu)先于默認(rèn)的。

    本地的HttpContext對象可以被用來定制HTTP狀態(tài)管理內(nèi)容,先于請求執(zhí)行或在請求執(zhí)行之后檢查它的狀態(tài):

    HttpClient httpclient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpGet httpget = new HttpGet("http://localhost:8080/");
    HttpResponse response = httpclient.execute(httpget, localContext);
    CookieOrigin cookieOrigin = (CookieOrigin) localContext.getAttribute(
    ClientContext.COOKIE_ORIGIN);
    System.out.println("Cookie origin: " + cookieOrigin);
    CookieSpec cookieSpec = (CookieSpec) localContext.getAttribute(
    ClientContext.COOKIE_SPEC);
    System.out.println("Cookie spec used: " + cookieSpec);

    3.9 每個用戶/線程的狀態(tài)管理

    我們可以使用獨(dú)立的本地執(zhí)行上下文來實現(xiàn)對每個用戶(或每個線程)狀態(tài)的管理。定義在本地內(nèi)容中的cookie規(guī)范注冊表和cookie存儲將會優(yōu)先于設(shè)置在HTTP客戶端級別中默認(rèn)的那些。
    HttpClient httpclient = new DefaultHttpClient();
    // 創(chuàng)建cookie store的本地實例
    CookieStore cookieStore = new BasicCookieStore();
    // 創(chuàng)建本地的HTTP內(nèi)容
    HttpContext localContext = new BasicHttpContext();
    // 綁定定制的cookie store到本地內(nèi)容中
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    HttpGet httpget = new HttpGet("http://www.google.com/");
    // 作為參數(shù)傳遞本地內(nèi)容
    HttpResponse response = httpclient.execute(httpget, localContext)



    http://www.cnblogs.com/loveyakamoz/archive/2011/07/21/2113246.html
    posted on 2012-09-26 16:43 abin 閱讀(969) 評論(0)  編輯  收藏 所屬分類: httpClient
    主站蜘蛛池模板: 亚洲AV日韩AV无码污污网站| 亚洲国产美女精品久久| 亚洲乱亚洲乱妇24p| 免费99精品国产自在现线| 亚洲福利视频一区二区三区| 久久国产精品2020免费m3u8 | 国产精品无码素人福利免费| 亚洲va久久久久| 大香人蕉免费视频75| www亚洲精品久久久乳| 国产三级免费电影| 一级毛片在线完整免费观看| 中文字幕精品亚洲无线码二区| jyzzjyzz国产免费观看| 国产AV无码专区亚洲Av| 最好看最新的中文字幕免费| 91亚洲国产成人久久精品| 成年女性特黄午夜视频免费看 | 亚洲人片在线观看天堂无码| 日本一道本高清免费| 国产特黄一级一片免费 | 99久热只有精品视频免费看| 国产成人无码综合亚洲日韩| 成人性生交大片免费看中文| 亚洲无成人网77777| 日本免费福利视频| 中文字幕久精品免费视频| 亚洲欧洲日产国码在线观看| 暖暖免费高清日本一区二区三区| xxxx日本在线播放免费不卡| 亚洲人成人网站色www| 国产成人精品免费视频网页大全| 久久亚洲精品11p| 亚洲精品国产成人专区| 日韩一区二区免费视频| 国产色爽免费无码视频| 亚洲变态另类一区二区三区| 国产av无码专区亚洲av果冻传媒| 中文字幕免费高清视频| 丰满妇女做a级毛片免费观看| 亚洲AV成人一区二区三区AV|