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
。
而這就是我卡住的地方,我有一個攔截器,但在閱讀請求體後,似乎邏輯不能繼續。
在您插入/更新數據庫(而不是在HTTP攔截器上)事務處理之前,您是否考慮過這麼做?你在使用任何ORM框架嗎?如果您正在使用休眠,則可以使用這些方法來創建審計條目。例如:https://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/ –
@random_dude我們沒有使用標準的數據庫,我們也不想只審覈每一個操作從特定網址發送的操作。在寫操作之前,我們沒有想要記錄事務的所有數據,因此我們需要在鏈中將其設置得高一些 –
爲什麼在設置它之後立即關閉輸入流? org.apache.commons.io.IOUtils.closeQuietly(is);' – TMtech