HttpsURLConnectionのを再利用...新しい接続を毎回取得する必要はありません。どのように再利用?
-
26-09-2019 - |
質問
私は私が持っている証明書を使用して、セキュアなWebサービスを呼び出したい...サーバーは証明書での認証に時間がかかり、そして、これはOK初めてである一方で、ユーザーは何度も繰り返し、それを呼び出します再び(同じ「セッション」で)と私は、接続を再利用することができるようにするべきだと感じています。
私は、次のコードを持っています。
System.setProperty("javax.net.ssl.trustStorePassword", "");
System.setProperty("javax.net.ssl.trustStore", "trusted.cacerts");
System.setProperty("javax.net.ssl.keyStorePassword", "mypassword");
System.setProperty("javax.net.ssl.keyStore", "trusted.clientcerts");
URL url = new URL("https://remoteserver:8443/testservice");
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "text/xml");
connection.setDoOutput(true);
OutputStream os = connection.getOutputStream();
os.write(bytes);
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
connection.disconnect();
これは素晴らしい作品...しかし、遅いです。ただ、認証は10秒程度かかります。この内部認証は、ここに典型的であり、それを高速化することができません。しかし、私は何とかそれを再利用することはできません?
私は(500)私は何度も何度もそれを思い出すことができ、それが失敗した考え、url.connection
および切断の間、このコードの周りにループを入れてみました。私はいくつかのコマンドの最初の時間を行うためには、少し周りのものを移動しようとしたが、それはまだ失敗。
私は、キープアライブについて読むが、これが何であるかのいずれかの良い例を発見していない、と(それも有効な方法である場合)、どのようにそれを使用します。私はHTMLを経由してこのすべてを行う場合は、FirefoxやIE経由で、ブラウザは最初は速く燃えるされた後に毎回ので、私は推測する、証明書をキャッシュすることができます。私はいくつかの方法があることをエミュレートすることはできますか?
解決
より良い代替手段はHttpClientをし、その接続プーリング・メカニズムを使用することです。また、表示された場合は、HTTPSキープアライブあなたを助けるために起こっている。
他のヒント
ちょうどconnection.disconnect()
を呼び出していない試してみてください...私はあなたがそれを行うための必要性がなければならないとは思いません。あなたは、しかし、あなたはそれを終了したら、あなたのreader
を閉じていることを確認する必要があります。