3

サーバー、Spring 2.5.6 を実行するスタンドアロンの SE アプリケーション、および組み込みの桟橋。クライアント、Swing アプリケーションは、HttpInvoker を使用してサーバーに接続します。

サーバーによって公開されるサービスは多数ありますが、現在、クライアントによって行われたすべての呼び出しを (ほぼ) ログに記録する必要があるという新しい要件が浮上しています。

私がやりたいことは、クライアントがいくつかの追加情報 (ユーザー名、workstationId などの文字列と整数) を送信することです。サーバー上の典型的なメソッドは次のようになります

public void doStuff(int someParam) {
   // Do stuff
   List result = method(someParam)

   // Audit
   // get the client information from somewhere?!!
   String username;
   int workstationId;

   auditDao.doStuffPerformed(username, workstationId, someParam, result);

}

では、サーバー上のメソッド内からクライアント情報を取得するにはどうすればよいでしょうか。

私が試した解決策の 1 つは、クライアント情報をリクエスト属性として追加し、メソッド RequestContextHolder.getRequestAttributes(); を呼び出すことです。メソッド内から。

クライアント側に CommonsHttpInvokerRequestExecutor を追加し、追加情報を追加するために次のメソッドをオーバーロードしました。

@Override
protected PostMethod createPostMethod(HttpInvokerClientConfiguration config) throws IOException {
  PostMethod postMethod = super.createPostMethod(config);
  postMethod.addRequestHeader("someHeader", "someHeader2");
  postMethod.addParameter("someParam", "someParam2");
  postMethod.setRequestHeader("someRequestHeader", "someRequestHeader2");
  return postMethod;
}

ただし、これは機能しません。サーバー上でヘッダーまたはパラメーターにアクセスできません。

どんな反応でも大歓迎です。

4

1 に答える 1

0

あなたは正しい軌道に乗っていると思います。サーバー側でカスタムのSimpleHttpInvokerServiceExporterサブクラスを使用し、オーバーライドして、クライアントによって設定されたヘッダーを引数readRemoteInvocationから抽出する必要があります。HttpExchange

これらのヘッダー値はThreadLocal、サーバー側コードのどこからでもアクセスできる静的セッション変数に格納できます。

于 2011-09-29T16:49:56.787 に答える