2011-09-29 88 views
3

服務器,運行Spring 2.5.6的獨立SE應用程序和嵌入式碼頭。 客戶端,Swing應用程序,使用HttpInvoker連接到服務器。審計HttpInvoker入侵

服務器暴露了很多服務,現在出現了新的需求,說我需要記錄(幾乎)客戶端發出的每個調用。

我想要做的是爲客戶發送一些額外的信息,(用戶名,工作站ID等字符串和整數)。 服務器上的一個典型的方法是這樣的

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); 

} 

那麼,如何從服務器上的方法中獲取客戶端的信息。

我嘗試過的一種解決方案是將客戶端信息添加爲請求屬性並調用方法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; 
} 

然而,這將無法正常工作。標題或參數在服務器上不可訪問。

任何反應將不勝感激。

回答

0

我認爲你是在正確的軌道上。您應該在服務器端使用自定義SimpleHttpInvokerServiceExporter子類,並覆蓋readRemoteInvocation以從HttpExchange參數中提取客戶端設置的標頭。

這些標頭值可以存儲在靜態ThreadLocal會話變量中,該變量可在服務器端代碼的任何位置訪問。

+0

感謝您的幫助。 我發現我沒有用CommonsHttpInvokerRequestExecutor調用服務,這就是爲什麼沒有出現頭文件。 當這個問題得到解決後,我所要做的就是調用RequestContextHolder.getRequestAttributes();從服務器上的方法內部獲取標題,我猜是最簡單的方法,因爲請求應該是線程安全的,所有:) – user971483