2010-12-28 1 views
4

Я не знаю, как работает CookieHandler в системе, я просмотрел источник CookieHandler, но не нашел больше информации, кроме методов get/set. Где TCP/HTTP соединение использует экземпляр CookieHandler, который я поставил наJava, пусть CookieHandler работает только с одним экземпляром

CookieHandler.setDefault(...) 

Какой файл источник я должен обратиться? URLConnection & HttpURLConnection, похоже, не имеет к этому никакого отношения.

Справка, спасибо заранее.


Редактировать: Можно ли применить CookieHandler только к одному экземпляру, в котором вызывается setDefault.

+0

Я задавался вопросом о том же. Эта [страница] (http://docs.oracle.com/javase/tutorial/networking/cookies/cookiehandler.html) может, надеюсь, иметь некоторую информацию, а именно «То есть, URL-адреса, которые используют HTTP в качестве протокола», новый URL («http://example.com») 'например, будет использовать обработчик протокола HTTP. Этот обработчик протокола обращается к объекту CookieHander, если он установлен, для управления состоянием». –

ответ

0

Я получил это работает, используя этот

private static class DelegatingCookieManager extends CookieManager { 
    @Override public void setCookiePolicy(CookiePolicy cookiePolicy) { 
     delegate.get().setCookiePolicy(cookiePolicy); 
    } 

    @Override public CookieStore getCookieStore() { 
     return delegate.get().getCookieStore(); 
    } 

    @Override public Map<String, List<String>> get(
      URI uri, Map<String, List<String>> requestHeaders) 
      throws IOException { 
     return delegate.get().get(uri, requestHeaders); 
    } 

    @Override public void put(URI uri, Map<String, 
      List<String>> responseHeaders) 
      throws IOException { 
     delegate.get().put(uri, responseHeaders); 
    } 
} 

которая устанавливается глобально

static { 
    CookieHandler.setDefault(new DelegatingCookieManager()); 
} 

но не имеет никакого состояния и делегировать до

private static final ThreadLocal<CookieManager> delegate = 
    new ThreadLocal<CookieManager>(); 

, который получает экземпляр в классе, где он привыкает

private final CookieManager ownCookieManager = new CookieManager(); 

как

delegate.set(ownCookieManager); 
doRequest(); 
+0

Я обратился к HttpClient, методу 'setCookieStore'. – user435657

+0

@ user435657 Скорее всего, это путь. Дело в том, что несколько мегабайт кода слишком сильно разбираются в синтаксическом анализе и написании одной строки ('Cookie' /' Set-Cookie'). – maaartinus