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