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

8

Мне нужно было подключиться к веб-сайту из нескольких потоков одновременно, используя 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();
}
Это вопрос? Похоже, вы перечисляете, что вы сделали. Вы спрашиваете, если это хорошая идея? Я думаю, что это не так. Этот код не является потокобезопасным. Только блокировка гарантирует, что каждый поток увидит только свое предназначенное CookieStore. Я рекомендую использовать HttpClient, если вы можете. Вы могли бы рассмотреть возможность размещения обзора кода, как это здесьcodereview.stackexchange.com John Watts
Я неправильно понял Я не вижу проблем с многопоточностью. Единственный минус, который я вижу, это то, что вам пришлось ссылаться на внутренний класс Sun. У вас есть проблемы с этим? John Watts
Я создал полный HowTo на основе этого @stackoverflow.com/questions/16305486/… Wurstbro
Согласен, но почему вы думаете, что этот код не является потокобезопасным? nivs

Ваш Ответ

1   ответ
1

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

Cookie: <name>=<value> [;<name>=<value>]...

Похожие вопросы