Как использовать разные куки для каждого соединения, используя HttpURLConnection и CookieManager в Java

Мне нужно было подключиться к веб-сайту из нескольких потоков одновременно, используя HttpURLConnection, но использовать разные куки для каждого подключения. Поскольку Java поддерживает только настройку глобального CookieManager, я реализовал следующий хак.

Вместо звонкаCookieHandler.setDefault(new CookieManager())Я реализовал пользовательскийCookieHandler который использует другойCookieStore экземпляр для каждого потока, который очищается после каждого запроса.

Я создал класс под названиемSessionCookieManager на основеисходный код изCookieManager.

cookieJar переменная-член была удалена, и ее использование было замененоgetCookieStore().

Следующий код был добавлен:

public class SessionCookieManager extends CookieHandler {
    private final static SessionCookieManager ms_instance = new SessionCookieManager();

    public static SessionCookieManager getInstance() {
        return ms_instance;
    }

    private final static ThreadLocal<CookieStore> ms_cookieJars = new ThreadLocal<CookieStore>() {
        @Override
        protected synchronized CookieStore initialValue() { return new sun.net.www.protocol.http.InMemoryCookieStore(); }
    };

    public void clear() {
        getCookieStore().removeAll();
    }

    public CookieStore getCookieStore() {
        return ms_cookieJars.get();
    }

Перед первым запросом кастомCookieManager устанавливается как глобальное значение по умолчаниюCookieHandler:

CookieHandler.setDefault(SessionCookieManager.getInstance());

После каждого запроса текущая темаCookieStore очищается:

try {
    ...
} finally {
    SessionCookieManager.getInstance().clear();
}

Ответы на вопрос(1)

Ваш ответ на вопрос