5

現在、Sun のクラスのバグに苦しんでいjava.net.Authenticatorます。Authenticatorクラスにはシステム全体の static があるようAuthenticatorです。これにより、マルチスレッド アプリケーションで次の問題が発生します。

  1. スレッド 1 - ユーザー 1 の認証
  2. スレッド 2 - ユーザー 2 の認証
  3. スレッド 1 - コードを実行して、ユーザー 1 のメッセージをダウンロードします。

この時点で、システムはユーザー 1 のメッセージではなく、ユーザー 2 のメッセージを取得します。

私は解決策を探してみました。多くの人が次のコードを試すことを提案しました:

AuthCacheValue.setAuthCache(new AuthCacheImpl());
Authenticator.setDefault(exchangeAuthenticator);

ただし、私のアプリケーションはマルチスレッドであるため、これは機能しません (exchangeAuthenticator最新のスレッドで初期化されたオーセンティケーターに常に設定されます)。

誰かが何か考えを持っているなら、現時点ではハックでも構いませんが、私はそれを本当に感謝していsynchronizedます.

4

1 に答える 1

7

私の経験では、最善の策は、組み込みのhttpサポートを廃止し、 ApacheのHttpClientを取得することです。

それが不可能な場合は、Authenticatorを拡張する単一のオブジェクトを作成しますが、ユーザー名とパスワードをThreadLocalインスタンスに保存します。このようにして、各スレッドは独自の値を取得できます。

于 2010-10-08T17:24:06.733 に答える