Как использовать разные куки для каждого соединения, используя 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 ответ

Один из способов - использовать заголовок Cookie напрямую, вместо того, чтобы отправлять cookie. Смотрите заголовок файла cookie здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384321(v=vs.85).aspx который вы можете изменить при каждом вызове.

Cookie: <name>=<value> [;<name>=<value>]...
Другие вопросы по тегам