Apache HttpComponents CookieStore не сохраняет файлы cookie

Я использую HttpComponents 4.5.2 и пытаюсь хранить файлы cookie, поскольку мне нужно использовать их для входа в систему и других запросов. Код работает нормально, пока приложение все еще работает, но проблема заключается в том, что когда я перезапускаю его, файлы cookie, которые должны были храниться в CookieStore, отсутствуют. Вот что я написал:

public static void main( String[] args ) throws InterruptedException
{
    RequestConfig globalConfig = RequestConfig.custom()
            .setCookieSpec(CookieSpecs.STANDARD).build();
    BasicCookieStore cookieStore = new BasicCookieStore();
    HttpClientContext context = HttpClientContext.create();
    context.setCookieStore(cookieStore);
    CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
            .setDefaultRequestConfig(globalConfig)
            .setDefaultCookieStore(cookieStore)
            .build();
    httpclient.start();
    login(httpclient, context);
}

public static void login(CloseableHttpAsyncClient httpClient, HttpClientContext context) throws InterruptedException
{
    JSONObject json = new JSONObject("{ email : blahblahblah1, password : blahblahblah2 }");
    StringEntity requestEntity = new StringEntity(
            json.toString(),
            ContentType.APPLICATION_JSON);

    HttpPost postMethod = new HttpPost("http://localhost:8080/login");
    postMethod.setEntity(requestEntity);

    final CountDownLatch latch = new CountDownLatch(1);
    httpClient.execute(postMethod, context, new FutureCallback<HttpResponse>() {

        public void completed(final HttpResponse response) {
            latch.countDown();
            System.out.println(postMethod.getRequestLine() + "->" + response.getStatusLine());
            //System.out.println(context.getCookieStore().getCookies().size());
        }

        public void failed(final Exception ex) {
            latch.countDown();
            System.out.println(postMethod.getRequestLine() + "->" + ex);
        }

        public void cancelled() {
            latch.countDown();
            System.out.println(postMethod.getRequestLine() + " cancelled");
        }

    });
    latch.await();
}

Я прочитал документацию HttpComponents, и в разделе 3.5 о файлах cookie говорится:

HttpClient может работать с любым физическим представлением постоянного хранилища файлов cookie, которое реализует интерфейс CookieStore. Реализация CookieStore по умолчанию, называемая BasicCookieStore, представляет собой простую реализацию, поддерживаемую java.util.ArrayList. Файлы cookie, хранящиеся в объекте BasicClientCookie, теряются при сборке мусора в объекте-контейнере. При необходимости пользователи могут предоставлять более сложные реализации.

Поэтому мне интересно, остается ли пользователям реализовать какую-то структуру, которая может эффективно хранить файлы cookie, или я что-то упускаю.


person C. Porto    schedule 16.10.2016    source источник


Ответы (1)


Да, использование BasicCookieStore при поддержке ArrayList означает, что когда ваш jvm существует, данные там теряются, как и любой ArrayList в памяти.

Класс BasicCookieStore также реализует класс Serializable, поэтому вы можете использовать его для сохранения на диск и восстановления при запуске приложения, если файл там был.

Вы можете позаимствовать код из тестов, подтверждающих, что поток TestBasicCookieStore#testSerialization.

person Ivan    schedule 16.10.2016