Verwendung unterschiedlicher Cookies für jede Verbindung mit HttpURLConnection und dem CookieManager in Java

Ich musste über HttpURLConnection von mehreren Threads gleichzeitig eine Verbindung zu einer Website herstellen, aber für jede Verbindung unterschiedliche Cookies verwenden. Da Java nur das Setzen eines globalen CookieManagers unterstützt, habe ich den folgenden Hack implementiert.

Anstatt anzurufenCookieHandler.setDefault(new CookieManager())Ich habe einen Brauch implementiertCookieHandler die eine andere verwendetCookieStore Instanz für jeden Thread, die nach jeder Anforderung gelöscht wird.

Ich habe eine Klasse namens erstelltSessionCookieManager basierend aufQuellcode vonCookieManager.

DascookieJar Die Mitgliedsvariable wurde entfernt und ihre Verwendung durch ersetztgetCookieStore().

Der folgende Code wurde hinzugefügt:

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();
    }

Vor der ersten Anfrage der BrauchCookieManager ist als globaler Standard festgelegtCookieHandler:

CookieHandler.setDefault(SessionCookieManager.getInstance());

Nach jeder Anfrage wird der aktuelle Thread angezeigtCookieStore wird gelöscht:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage