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