CRUD操作により、クライアント要求をサーバー上で監査し始めました。CXFリクエストの前処理と後処理の処理
監査クラスを呼び出して要求をログに記録する代わりに、CXFフィルタを使用して、&の各プロセスの後処理を前処理します。私はどういう意味ですか?
古い値(変更前はDBへの操作)を含むすべての更新要求(JSONを含む)を監査したいが、の要求が正常に完了した後にのみのログに記録する。
(jaxsrs:providersタグとExceptionMapper実装を使用して)例外がスローされたときにレスポンスボディを変更するためにこのメソッドを使用していますが、前処理または後処理にどのように使用するのか理解できません。リクエスト。
ありがとうございます!
UPDATE:
さて、私はちょっと、私はCXFインターセプターを作るために何をする必要があるか理解:
- クラスのコンストラクタ呼び出し
super(Phase.[the-needed-pahse])
でAbstractPhaseInterceptor
- を拡張するクラスを作成します。インターセプタがいつ実行されるかを決定します(hereはすべての着信/発信フェーズのリストです)
- オーバーライド
handleMessage
それが継承されたメソッドであるとして、ここではあなたがたとえば、プロジェクト
のweb.xml
ファイルにインターセプターを追加
public void handleMessage(Message request) throws Fault {
try {
InputStream is = request.getContent(InputStream.class);
String reqBodyAsString = org.apache.commons.io.IOUtils.toString(is, "UTF-8");
IOUtils.closeQuietly(is);
// Do the logic
is = org.apache.commons.io.IOUtils.toInputStream(reqBodyAsString, "UTF-8");
request.setContent(InputStream.class, is);
org.apache.commons.io.IOUtils.closeQuietly(is);
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
とweb.xml
ファイル:
<jaxrs:server id="[id]" address="[URL]">
<jaxrs:inInterceptors><!-- because we want it to run BEFORE the request logic -->
<ref bean="[interceptor-id]" />
</jaxrs:inInterceptors>
</jaxrs:server>
<bean id="[interceptor-id]" class="[package-path.interceptor-class-name]"/>
私はそれを要求に再度書きます。それは、私の体がnull
であるという例外が出るからです。
これは私が立ち往生しているところですが、私はインターセプタを持っていますが、リクエストボディを読んだ後は、ロジックを続行できないようです。
(HTTPインターセプタではなく)データベースに挿入/更新する前に、 ORMフレームワークを使用していますか?休止状態を使用している場合は、イベントを利用して監査エントリを作成する方法があります。例:https://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/ –
@random_dude私たちは標準のDBを使用していないため、特定の操作のみをすべて監査する必要はありません特定のURLから送信された操作。書き込み操作の前に、トランザクションについて記録したいデータがすべてあるわけではないので、チェーンの中で少し高くする必要があります –
なぜ入力ストリームを設定したらすぐに閉じるのですか? org.apache.commons.io.IOUtils.close Quietly(is); ' – TMtech