2016-11-01 20 views
0

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であるという例外が出るからです。

    これは私が立ち往生しているところですが、私はインターセプタを持っていますが、リクエストボディを読んだ後は、ロジックを続行できないようです。

  • +0

    (HTTPインターセプタではなく)データベースに挿入/更新する前に、 ORMフレームワークを使用していますか?休止状態を使用している場合は、イベントを利用して監査エントリを作成する方法があります。例:https://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/ –

    +0

    @random_dude私たちは標準のDBを使用していないため、特定の操作のみをすべて監査する必要はありません特定のURLから送信された操作。書き込み操作の前に、トランザクションについて記録したいデータがすべてあるわけではないので、チェーンの中で少し高くする必要があります –

    +0

    なぜ入力ストリームを設定したらすぐに閉じるのですか? org.apache.commons.io.IOUtils.close Quietly(is); ' – TMtech

    答えて

    0

    リクエストストリームを消費しています。あなたは、ログインする前に、それをキャッシュし、

    public void handleMessage(Message message) { 
         //Get the message body into payload[] and set a new non-consumed inputStream into Message 
         InputStream in = message.getContent(InputStream.class); 
         byte payload[] = IOUtils.readBytesFromStream(in); //log this 
         ByteArrayInputStream bin = new ByteArrayInputStream(payload); 
        message.setContent(InputStream.class, bin); 
    } 
    

    閉じるストリームが必要とされていないCXFメッセージに新しいストリームを設定する必要があります。また、CXFのデフォルトのロギングインターセプタを使用することもできます。https://stackoverflow.com/a/37820362/6371459