欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java HttpClient執(zhí)行請(qǐng)求時(shí)配置cookie流程詳細(xì)講解

 更新時(shí)間:2023年02月03日 14:14:57   作者:?????  
這篇文章主要介紹了Java HttpClient執(zhí)行請(qǐng)求時(shí)配置cookie流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java5 枚舉類詳解及實(shí)例代碼

    Java5 枚舉類詳解及實(shí)例代碼

    這篇文章主要介紹了Java5 枚舉類詳解及實(shí)例代碼的相關(guān)資料,枚舉類是java5 新類型,全部都是類型安全的形式表示,需要的朋友可以參考下
    2016-12-12
  • SpringMVC整合SSM實(shí)現(xià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-10
  • 微信跳一跳輔助Java代碼實(shí)現(xiàn)

    微信跳一跳輔助Java代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了微信跳一跳輔助的Java代碼實(shí)現(xiàn)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式

    Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式

    在Java中處理文件向來是一種不是很方便的操作,然后隨著Spring框架的崛起,使用Spring框架中的MultipartFile來處理文件也是件很方便的事了,今天就給大家介紹Spring將MultipartFile轉(zhuǎn)存到本地磁盤的方式,需要的朋友可以參考下
    2024-10-10
  • 關(guān)于aop切面 注解、參數(shù)如何獲取

    關(guān)于aop切面 注解、參數(shù)如何獲取

    這篇文章主要介紹了關(guān)于aop切面 注解、參數(shù)如何獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java單例模式與破壞單例模式概念原理深入講解

    Java單例模式與破壞單例模式概念原理深入講解

    單例模式(Singleton?Pattern)是?Java?中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建
    2023-02-02
  • Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解

    Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解

    這篇文章主要介紹了Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java concurrency之LockSupport_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency之LockSupport_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Java concurrency之LockSupport的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java編程線程間通信與信號(hào)量代碼示例

    Java編程線程間通信與信號(hào)量代碼示例

    這篇文章主要介紹了Java編程線程間通信與信號(hào)量代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • java struts2學(xué)習(xí)筆記之線程安全

    java struts2學(xué)習(xí)筆記之線程安全

    這篇文章主要為大家詳細(xì)介紹了java struts2學(xué)習(xí)筆記之線程安全,感興趣的朋友可以參考一下
    2016-04-04

最新評(píng)論