2016-11-01 138 views
0

我們開始通過其CRUD操作對服務器上的客戶請求進行審覈。處理CXF請求的前/後處理

我們不是調用審計類來記錄請求,而是使用CXF過濾器預處理每個請求的後處理。我是什麼意思?

我們希望審覈每個更新請求(包含JSON)及其舊值(在更改之前,對數據庫執行GET操作),但僅在請求成功完成後纔將其記錄到記錄器

當引發異常時(通過使用jaxsrs:providers標記和ExceptionMapper實現),我們已經在使用這種方法來更改響應主體,但我無法理解如何使用它來進行前/後處理要求。

謝謝!


UPDATE

嗯,我有點明白了,我需要做的,使一個CXF攔截:

  • 創建擴展AbstractPhaseInterceptor
  • 在類的構造函數調用super(Phase.[the-needed-pahse])類決定你的攔截器何時運行(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 file:

<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]"/> 

你可以看到在讀完c意圖我把它寫回請求。那是因爲我得到一個異常,說我的身體是null

而這就是我卡住的地方,我有一個攔截器,但在閱讀請求體後,似乎邏輯不能繼續。

+0

在您插入/更新數據庫(而不是在HTTP攔截器上)事務處理之前,您是否考慮過這麼做?你在使用任何ORM框架嗎?如果您正在使用休眠,則可以使用這些方法來創建審計條目。例如:https://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/ –

+0

@random_dude我們沒有使用標準的數據庫,我們也不想只審覈每一個操作從特定網址發送的操作。在寫操作之前,我們沒有想要記錄事務的所有數據,因此我們需要在鏈中將其設置得高一些 –

+0

爲什麼在設置它之後立即關閉輸入流? org.apache.commons.io.IOUtils.closeQuietly(is);' – TMtech

回答

0

您正在使用請求流。您需要登錄前緩存它,並在CXF消息中設置一個新的流不需要

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默認日誌記錄攔截器https://stackoverflow.com/a/37820362/6371459