文章將介紹在Apache HttpClient 4 中cookie的使用。html
在新的HttpClient 4.3中。咱們將充分利用開放的API來管理設置咱們的客戶端連接
首先,咱們須要創造一個cookie store 並將咱們的cookie 放入裏面: java
BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); cookie.setPath("/"); cookieStore.addCookie(cookie);而後,咱們在HttpClient 上設置咱們剛剛建立的cookie併發送請求:
@Test public void whenSettingCookiesOnTheHttpClient_thenCookieSentCorrectly() throws ClientProtocolException, IOException { BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); cookie.setPath("/"); cookieStore.addCookie(cookie); HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(cookieStore).build();</p> <pre><code>final HttpGet request = new HttpGet("http://www.github.com"); response = client.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); </code>
} 設置那個域名十分重要。不設置的話,客戶端將不會發送cookie,至關於cookie綁定在.github.com上 git
在4.3以前的HttpClient 版本中,cookie是直接設置在HttpClient上的。 github
@Test public void givenUsingDeprecatedApi_whenSettingCookiesOnTheHttpClient_thenCorrect() throws ClientProtocolException, IOException { BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); cookie.setPath("/"); cookieStore.addCookie(cookie); DefaultHttpClient client = new DefaultHttpClient(); client.setCookieStore(cookieStore);</p> <pre><code>HttpGet request = new HttpGet("http://www.github.com"); response = client.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); </code>
} 除了client 的建立,其餘地方沒有區別;cookie
要設置整個HttpClient 的cookie ,咱們能夠單獨配置請求cookie: 併發
@Test public void whenSettingCookiesOnTheRequest_thenCookieSentCorrectly() throws ClientProtocolException, IOException { BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); cookie.setPath("/"); cookieStore.addCookie(cookie); instance = HttpClientBuilder.create().build();</p> <pre><code>HttpGet request = new HttpGet("http://www.github.com"); HttpContext localContext = new BasicHttpContext(); localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); // localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); // before 4.3 response = instance.execute(request, localContext); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); </code>
} ui
在Header上設置簡單的cookie值用於請求 code
@Test public void whenSettingCookiesOnARequest_thenCorrect() throws ClientProtocolException, IOException { instance = HttpClientBuilder.create().build(); HttpGet request = new HttpGet("http://www.github.com"); request.setHeader("Cookie", "JSESSIONID=1234"); response = instance.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }這比使用上面方法建立的cookie更容易出錯,在咱們沒有設置域名的狀況下,這樣的作法就是錯的。
本文演示瞭如何使用Httpclient自定義cookie發送請求htm