Java HttpClient執(zhí)行請求時配置cookie流程詳細講解
簡介:Java使用HttpClient執(zhí)行請求一些網(wǎng)頁時,可能需要登陸或維護一下cookie,才能請求到我們想要的數(shù)據(jù)。本文就要介紹一下使用HttpClient執(zhí)行請求時設(shè)置cookie和維持維護cookie的方法及示例代碼。
1?添加定義cookie
1) 創(chuàng)建一個cookie存儲并在該存儲中設(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ù)請求設(shè)置Cookie
如果不能在整個HttpClient上設(shè)置cookie,則可以使用HttpContext類分別使用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();
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) 低級請求上設(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?維護保存響應(yīng)的cookie
從httpClientContext.getCookieStore()讀取到響應(yīng)的cookie信息保存起來,下次請求之前可以使用HttpClientBuilder.create().setDefaultCookieStore()方法設(shè)置之前保存的cookie信息,執(zhí)行請求時就會攜帶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 {
//待請求的地址
String url = "http://www.example.com";
//請求參數(shù)
List<NameValuePair> loginNV = new ArrayList<>();
loginNV.add(new BasicNameValuePair("userName", "test"));
loginNV.add(new BasicNameValuePair("passWord", "test"));
//構(gòu)造請求資源地址
URI uri = new URIBuilder(url).addParameters(loginNV).build();
//創(chuàng)建一個HttpContext對象,用來保存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對象
HttpClient httpClient = HttpClients.custom().setDefaultHeaders(headerList).build();
//構(gòu)造請求對象
HttpUriRequest httpUriRequest = RequestBuilder.get().setUri(uri).build();
//執(zhí)行請求,傳入HttpContext,將會得到請求結(jié)果的信息
httpClient.execute(httpUriRequest, httpClientContext);
//獲取請求結(jié)果中Cookie,此時的Cookie已經(jīng)帶有登錄信息了
CookieStore cookieStore = httpClientContext.getCookieStore();
//這個CookieStore保存了我們的登錄信息,我們可以先將它保存到某個本地文件,后面直接讀取使用
saveCookieStore(cookieStore,"cookie");
//使用Cookie來請求,首先讀取之前的Cookie
CookieStore cookieStore1 = readCookieStore("cookie");
//構(gòu)造一個帶這個Cookie的HttpClient
HttpClient newHttpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore1).build();
//使用新的HttpClient請求。此時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í)行請求時配置cookie流程詳細講解的文章就介紹到這了,更多相關(guān)Java配置cookie內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java?11新特性HttpClient主要組件及發(fā)送請求示例詳解
- Java通過httpclient比較重定向和請求轉(zhuǎn)發(fā)
- Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)
- java中httpclient封裝post請求和get的請求實例
- java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解
- java發(fā)送form-data請求實現(xiàn)文件上傳的示例代碼
- Java請求調(diào)用參數(shù)格式為form-data類型的接口代碼示例
- Java后臺接收數(shù)據(jù)的三種方式(url、form-data與application/json)
- Java httpclient請求form-data格式并設(shè)置boundary代碼實現(xiàn)方法
相關(guān)文章
Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式
在Java中處理文件向來是一種不是很方便的操作,然后隨著Spring框架的崛起,使用Spring框架中的MultipartFile來處理文件也是件很方便的事了,今天就給大家介紹Spring將MultipartFile轉(zhuǎn)存到本地磁盤的方式,需要的朋友可以參考下2024-10-10
Java concurrency之LockSupport_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Java concurrency之LockSupport的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

