私は 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 は、コンテナー オブジェクトがガベージ コレクションされると失われます。必要に応じて、ユーザーはより複雑な実装を提供できます
だから、クッキーを効果的に保存できる何らかの構造を実装するのはユーザーに任されているのか、それとも何かが欠けているのか疑問に思っています。