質問

私は、基本認証を使用してRESTインターフェースに話しEclipseプラグインを構築しています。認証が失敗したとき、私は私のプラグインの設定ダイアログをポップアップし、再試行したいと思います。通常、私は、このために、すべてのAuthenticator.setDefault()年代のセットアップにオーセンティケータを静的HttpURLConnectionを使用することができますが、私はプラグインを書いていますので、私は、EclipseのデフォルトのAuthenticatororg.eclipse.ui.internal.net.auth)を上書きしたくない;

私はすぐにその概念を失った私はロードする前に、私のカスタムAuthenticatorを設定し、その後バックEclipseのデフォルトを置くことを考えたが、私はこれがそうマルチスレッドでのレースの問題のすべての種類の原因となります想像します。

、Googleの検索結果のすべての種類は、基本的にそれは不可能です私に言っ得ます:

  

のJava URLConnectionのAPIはsetAuthenticator(認証)が容易認証が必要なマルチスレッドコンテキストでこのクラスを使用するように作製するための方法を持つ必要があります。

ソースする

  

のアプリケーションは、いくつかのサードパーティ製のプラグインが含まれており、それぞれのプラグインは、私たちが何をすべきか、独自の認証を使用する場合は? 「Authenticator.setDefault()」メソッドの各呼び出しは

...以前に定義された認証を書き換えます

ソース

私はこの問題を克服するために役立つかもしれない任意の異なるアプローチがありますか?

役に立ちましたか?

解決

それはHttpURLConnectionのでは不可能である場合は、

私はから 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クライアントで活用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top