HttpClient 4 – Send Custom Cookie

1. Overview

This tutorial will focus on how to send a Custom Cookie using the Apache HttpClient 4.

If you want to dig deeper and learn other cool things you can do with the HttpClient – head on over to the main HttpClient tutorial.

2. Configure Cookie Management on the HttpClient

2.1. HttpClient After 4.3

In the newer HttpClient 4.3, we’ll leverage the fluent builder API responsible with both constructing and configuring the client.

First, we’ll need to create a cookie store and set up our sample cookie in the store:

BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", "1234");
cookie.setDomain(".github.com");
cookie.setPath("/");
cookieStore.addCookie(cookie);

Then, we can set up this cookie store on the HttpClient using the setDefaultCookieStore() method and send the request:

@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));
}

A very important element is the domain being set on the cookie – without setting the proper domain, the client will not send the cookie at all!

Also, depending on the exact version you use, you may also need to set:

cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");

2.2. HttpClient Before 4.3

With older versions of the HttpClient (before 4.3) – the cookie store was set directly on the HttpClient:

@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));
}

Other than the way the client is built, there’s no other difference from the previous example.

3. Set the Cookie on the Request

If setting the cookie on the entire HttpClient is not an option, we can configure requests with the cookie individually using the HttpContext class:

@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));
}

4. Set the Cookie on the Low Level Request

A low level alternative of setting the cookie on the HTTP Request would be setting it as a raw Header:

@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));
}

This is of course much more error-prone than working with the built in cookie support. For example, notice that we’re no longer setting the domain in this case – which is not correct.

5. Conclusion

This article illustrated how to work with the HttpClient to send a custom, user controlled Cookie.

Note that this is not the same as letting the HttpClient deal with the cookies set by a server. Instead, it’s controlling the client side manually at a low level.

The implementation of all these examples and code snippets can be found in my github project.

Related posts:

Disable Spring Data Auto Configuration
Java Program to Implement a Binary Search Algorithm for a Specific Search Sequence
Send an email with an attachment
Integer Constant Pool trong Java
Java Program to Implement Network Flow Problem
Spring Boot - Admin Client
Java Program to Implement ArrayBlockingQueue API
Java Program to Implement DelayQueue API
Dockerizing a Spring Boot Application
Spring Autowiring of Generic Types
Từ khóa throw và throws trong Java
Java Program to Solve a Matching Problem for a Given Specific Case
Create a Custom Exception in Java
Exploring the Spring Boot TestRestTemplate
Java Program to Use the Bellman-Ford Algorithm to Find the Shortest Path
Java Program to Implement Coppersmith Freivald’s Algorithm
Converting Between Byte Arrays and Hexadecimal Strings in Java
Guide to the Fork/Join Framework in Java
Tìm hiểu về xác thực và phân quyền trong ứng dụng
HttpClient Basic Authentication
Java Program to Implement Gaussian Elimination Algorithm
Guide to the Java ArrayList
Fixing 401s with CORS Preflights and Spring Security
Java Program to Generate a Random Subset by Coin Flipping
How to Store Duplicate Keys in a Map in Java?
An Intro to Spring Cloud Contract
Java Program to Implement Sorting of Less than 100 Numbers in O(n) Complexity
Injecting Prototype Beans into a Singleton Instance in Spring
Mệnh đề Switch-case trong java
Java Program to Implement First Fit Decreasing for 1-D Objects and M Bins
Tính kế thừa (Inheritance) trong java
Lấy ngày giờ hiện tại trong Java