Java HttpClient執(zhí)行請(qǐng)求時(shí)配置cookie流程詳細(xì)講解
簡(jiǎn)介:Java使用HttpClient執(zhí)行請(qǐng)求一些網(wǎng)頁時(shí),可能需要登陸或維護(hù)一下cookie,才能請(qǐng)求到我們想要的數(shù)據(jù)。本文就要介紹一下使用HttpClient執(zhí)行請(qǐng)求時(shí)設(shè)置cookie和維持維護(hù)cookie的方法及示例代碼。
1?添加定義cookie
1) 創(chuàng)建一個(gè)cookie存儲(chǔ)并在該存儲(chǔ)中設(shè)置示例cookie
BasicCookieStore cookieStore = new BasicCookieStore(); BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234"); cookie.setDomain(".github.com"); cookie.setPath("/"); cookieStore.addCookie(cookie);
2) HttpClient 4.3之前版本
@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); HttpGet request = new HttpGet("http://www.github.com"); response = client.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }
3) HttpClient 4.3之后版本
@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(); final HttpGet request = new HttpGet("http://www.github.com"); response = client.execute(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(200)); }
4) 根據(jù)請(qǐng)求設(shè)置Cookie
如果不能在整個(gè)HttpClient上設(shè)置cookie,則可以使用HttpContext類分別使用cookie配置請(qǐng)求:
@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(); 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)); }
5) 低級(jí)請(qǐng)求上設(shè)置Cookie
@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)); }
2?維護(hù)保存響應(yīng)的cookie
從httpClientContext.getCookieStore()
讀取到響應(yīng)的cookie信息保存起來,下次請(qǐng)求之前可以使用HttpClientBuilder.create().setDefaultCookieStore()
方法設(shè)置之前保存的cookie信息,執(zhí)行請(qǐng)求時(shí)就會(huì)攜帶cookie信息,具體代碼如下:
package org.hfutec.crawler.main; import com.google.common.collect.Lists; import org.apache.http.Header; import org.apache.http.HttpHeaders; import org.apache.http.NameValuePair; import org.apache.http.client.CookieStore; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicNameValuePair; import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; public class RequestWithCookie { public static void main(String[] args) throws URISyntaxException, IOException, ClassNotFoundException { //待請(qǐng)求的地址 String url = "http://www.example.com"; //請(qǐng)求參數(shù) List<NameValuePair> loginNV = new ArrayList<>(); loginNV.add(new BasicNameValuePair("userName", "test")); loginNV.add(new BasicNameValuePair("passWord", "test")); //構(gòu)造請(qǐng)求資源地址 URI uri = new URIBuilder(url).addParameters(loginNV).build(); //創(chuàng)建一個(gè)HttpContext對(duì)象,用來保存Cookie HttpClientContext httpClientContext = HttpClientContext.create(); //構(gòu)造自定義Header信息 List<Header> headerList = Lists.newArrayList(); headerList.add(new BasicHeader(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9," + "image/webp,image/apng,*/*;q=0.8")); headerList.add(new BasicHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36")); headerList.add(new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate")); headerList.add(new BasicHeader(HttpHeaders.CACHE_CONTROL, "max-age=0")); headerList.add(new BasicHeader(HttpHeaders.CONNECTION, "keep-alive")); headerList.add(new BasicHeader(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2," + "de;q=0.2")); //構(gòu)造自定義的HttpClient對(duì)象 HttpClient httpClient = HttpClients.custom().setDefaultHeaders(headerList).build(); //構(gòu)造請(qǐng)求對(duì)象 HttpUriRequest httpUriRequest = RequestBuilder.get().setUri(uri).build(); //執(zhí)行請(qǐng)求,傳入HttpContext,將會(huì)得到請(qǐng)求結(jié)果的信息 httpClient.execute(httpUriRequest, httpClientContext); //獲取請(qǐng)求結(jié)果中Cookie,此時(shí)的Cookie已經(jīng)帶有登錄信息了 CookieStore cookieStore = httpClientContext.getCookieStore(); //這個(gè)CookieStore保存了我們的登錄信息,我們可以先將它保存到某個(gè)本地文件,后面直接讀取使用 saveCookieStore(cookieStore,"cookie"); //使用Cookie來請(qǐng)求,首先讀取之前的Cookie CookieStore cookieStore1 = readCookieStore("cookie"); //構(gòu)造一個(gè)帶這個(gè)Cookie的HttpClient HttpClient newHttpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore1).build(); //使用新的HttpClient請(qǐng)求。此時(shí)HttpClient已經(jīng)帶有了之前的登錄信息,再爬取就不用登錄了 newHttpClient.execute(httpUriRequest, httpClientContext); } //使用序列化的方式保存CookieStore到本地文件,方便后續(xù)的讀取使用 private static void saveCookieStore( CookieStore cookieStore, String savePath ) throws IOException { FileOutputStream fs = new FileOutputStream(savePath); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(cookieStore); os.close(); } //讀取Cookie的序列化文件,讀取后可以直接使用 private static CookieStore readCookieStore( String savePath ) throws IOException, ClassNotFoundException { FileInputStream fs = new FileInputStream("cookie");//("foo.ser"); ObjectInputStream ois = new ObjectInputStream(fs); CookieStore cookieStore = (CookieStore) ois.readObject(); ois.close(); return cookieStore; } }
到此這篇關(guān)于Java HttpClient執(zhí)行請(qǐng)求時(shí)配置cookie流程詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java配置cookie內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java?11新特性HttpClient主要組件及發(fā)送請(qǐng)求示例詳解
- Java通過httpclient比較重定向和請(qǐng)求轉(zhuǎn)發(fā)
- Java HttpClient-Restful工具各種請(qǐng)求高度封裝提煉及總結(jié)
- java中httpclient封裝post請(qǐng)求和get的請(qǐng)求實(shí)例
- java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請(qǐng)求方法詳解
- java發(fā)送form-data請(qǐng)求實(shí)現(xiàn)文件上傳的示例代碼
- Java請(qǐng)求調(diào)用參數(shù)格式為form-data類型的接口代碼示例
- Java后臺(tái)接收數(shù)據(jù)的三種方式(url、form-data與application/json)
- Java httpclient請(qǐng)求form-data格式并設(shè)置boundary代碼實(shí)現(xiàn)方法
相關(guān)文章
SpringMVC整合SSM實(shí)現(xiàn)異常處理器詳解
SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦。基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開發(fā)2022-10-10Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式
在Java中處理文件向來是一種不是很方便的操作,然后隨著Spring框架的崛起,使用Spring框架中的MultipartFile來處理文件也是件很方便的事了,今天就給大家介紹Spring將MultipartFile轉(zhuǎn)存到本地磁盤的方式,需要的朋友可以參考下2024-10-10Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解
這篇文章主要介紹了Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Java concurrency之LockSupport_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之LockSupport的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06java struts2學(xué)習(xí)筆記之線程安全
這篇文章主要為大家詳細(xì)介紹了java struts2學(xué)習(xí)筆記之線程安全,感興趣的朋友可以參考一下2016-04-04