0

私は HttpComponents 4.5.2 を使用しています。ログインやその他の要求に使用する必要があるため、Cookie を保存しようとしています。アプリケーションがまだ実行されている間、コードは正常に動作しますが、ここでの問題は、アプリケーションを再起動すると、CookieStore に保存されるはずの Cookie がそこにないことです。ここに私が書いたものがあります:

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のドキュメントを読みました.Cookieに関するセクション3.5には次のように書かれています:

HttpClient は、CookieStore インターフェイスを実装する永続的な Cookie ストアの任意の物理表現を操作できます。BasicCookieStore と呼ばれるデフォルトの CookieStore 実装は、java.util.ArrayList に基づく単純な実装です。BasicClientCookie オブジェクトに格納されている Cookie は、コンテナー オブジェクトがガベージ コレクションされると失われます。必要に応じて、ユーザーはより複雑な実装を提供できます

だから、クッキーを効果的に保存できる何らかの構造を実装するのはユーザーに任されているのか、それとも何かが欠けているのか疑問に思っています。

4

1 に答える 1

0

はい、BasicCookieStorebacked を使用ArrayListすると、jvm が存在する場合、そこにあるデータはメモリ内の ArrayList と同じように失われます。

BasicCookieStoreクラスも実装されSerializableているため、それを使用してディスクに保存し、ファイルがあった場合はアプリの起動時に復元できます。

そのフローTestBasicCookieStore#testSerializationを検証するテストからいくつかのコードを借りることができます。

于 2016-10-16T18:07:26.000 に答える