接続ごとにJavaの認証?
-
11-09-2019 - |
質問
私は、基本認証を使用してRESTインターフェースに話しEclipseプラグインを構築しています。認証が失敗したとき、私は私のプラグインの設定ダイアログをポップアップし、再試行したいと思います。通常、私は、このために、すべてのAuthenticator.setDefault()
年代のセットアップにオーセンティケータを静的HttpURLConnection
を使用することができますが、私はプラグインを書いていますので、私は、EclipseのデフォルトのAuthenticator
(org.eclipse.ui.internal.net.auth
)を上書きしたくない;
私はすぐにその概念を失った私はロードする前に、私のカスタムAuthenticator
を設定し、その後バックEclipseのデフォルトを置くことを考えたが、私はこれがそうマルチスレッドでのレースの問題のすべての種類の原因となります想像します。
、Googleの検索結果のすべての種類は、基本的にそれは不可能です私に言っ得ます:
のJava URLConnectionのAPIはsetAuthenticator(認証)が容易認証が必要なマルチスレッドコンテキストでこのクラスを使用するように作製するための方法を持つ必要があります。
のアプリケーションは、いくつかのサードパーティ製のプラグインが含まれており、それぞれのプラグインは、私たちが何をすべきか、独自の認証を使用する場合は? 「Authenticator.setDefault()」メソッドの各呼び出しは
...以前に定義された認証を書き換えます
ソースの
私はこの問題を克服するために役立つかもしれない任意の異なるアプローチがありますか?
解決
私はから HTTPClientののライブラリを使用することをお勧めしApacheの。
簡単な例:
HttpClient client = new HttpClient();
client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("test","test"));
GetMethod getMethod = new GetMethod("http://www.example.com/mylogin");
client.executeMethod(getMethod);
System.out.println(getMethod.getResponseBodyAsString());
他のヒント
別のアプローチは、接続で基本認証を自分で実行するようになります。
final byte[] encodedBytes = Base64.encodeData((username + ':' + new String(password)).getBytes("iso-8859-1"));
final String encoded = new String(encodedBytes, "iso-8859-1");
connection.setRequestProperty("Authorization", "Basic " + encoded);
これは、後続リクエストに応じて信用証明書を提供する前に401を受信するために認証されていない要求を必要としないという利点を有するであろう。同様の挙動が先制認証を要求することにより、ApacheのHTTPクライアントで活用することができます。