1

同じホスト上の 2 つの対応する Axis2 Web サービスにアクセスする 2 つのサーブレットがあります。サーブレットの 1 つは読み取り専用で、もう 1 つはデータベースに書き込みます。

各 Axis2 Web サービスは、BASIC 認証を使用します。読み取り専用 Web サービスはシステム アカウントを使用しますが、書き込み Web サービスはユーザーの資格情報 (Web フォームの一部として送信される) を使用します。

私が直面している問題は、secondと呼ばれるサーブレットが常にその Web サービスへの認証に失敗することです。たとえば、サーブレットを介して読み取り専用サービスを照会することはできますが、書き込みサービスを使用しようとすると「401: 認証が必要です」というメッセージが表示されます。最初に書き込みサービスを呼び出すと、読み取り専用サービスを使用しようとすると同じエラーが発生します。

サーブレットで接続の資格情報を設定する方法は次のとおりです。

Stub service = new Stub(serviceUrl);
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setUsername(username);
auth.setPassword(password);
auth.setPreemptiveAuthentication(true);

service._getServiceClient().getOptions().setProperty(HTTPConstants.AUTHENTICATE, auth);

読み取り専用サービスにアクセスするサーブレットのコンストラクターには、このコードが含まれています。書き込みサービスにアクセスするサーブレットには、doGet/doPost メソッドにこのコードがあります。

最初に呼び出されたサービスの資格情報がどこかにキャッシュされているようですが、どこにあるのかわかりません。ここで可能な解決策を見ましたが、WSClientConstants.CACHED_HTTP_STATE定義されている場所が見つかりません。この JIRA の問題のコメントは、それが一部であることを暗示しているようですorg.apache.axis2.transport.http.HTTPConstantsが、そこにはありません。

仕様:

  • 軸のバージョン: 1.5.1
  • トムキャットのバージョン: 6.0.26
  • Java バージョン: 1.6.0_23
4

2 に答える 2

1

2 つの異なるサービスへの接続が同じ JSESSIONID を使用していたことが判明しました。したがって、2 番目の Web サービスへの接続は、最初の Web サービスに対して認証されたセッションを使用しようとしていたため、エラーが発生しました。

HttpClientこれに対する私の解決策は、次のようにして各サービスを定義することでした

MultiThreadedHttpConnectionManager manager = new MuliThreadedHttpConnectionManager();
HttpClient client = new HttpClient(manager);

ConfigurationContext context = ConfigurationContextFactory.createDefaultConfigurationContext();
context.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, client);
context.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, true);

Stub service = new Stub(context, serviceUrl);

これにより、両方のサーブレットが対応するサービスに対して個別のセッションを持つことができます。

于 2012-06-25T18:04:19.587 に答える