Spring MVC過濾器-上下文資訊過濾器(AbstractRequestLoggingFilter及其子類)
AbstractRequestLoggingFilter類定義了兩個方法beforeRequest和afterRequest分別用於設定過濾前後執行的操作,它有三個子類,分別是CommonsRequestLoggingFilter、ServletContextRequestLoggingFilter和Log4jNestedDiagnosticContextFilter,這三個子類分別實現了各自的beforeRequest和afterRequest。其中,CommonsRequestLoggingFilter在過濾前後分別打印出一段debug的資訊;ServletContextRequestLoggingFilter在過濾前後分別向日志文件中寫入一段日誌資訊,日誌檔案可由log4j.properties等指定;Log4jNestedDiagnosticContextFilter則將日誌資訊儲存到NDC中,NDC採用了一個類似棧的機制來push和pot上下文資訊,每一個執行緒都獨立地儲存上下文資訊,比如說一個servlet就可以針對 每一個request建立對應的NDC,儲存客戶端地址等資訊。
當然,在AbstractRequestLoggingFilter中,還包含很多其他方法:
setIncludeQueryString:查詢語句是否包含在日誌檔案中,true或false;
setIncludeClientInfo:客戶地址和session id是否包含在日誌中,true或false;
setIncludePayload:負載資訊是否包含在日誌資訊中,true或false;
setMaxPayloadLength:最大負載量,int值;
setBeforeMessagePrefix:日誌資訊前的資訊的字首;
setBeforeMessageSuffix:日誌資訊前的資訊的字尾;
setAfterMessagePrefix:日誌資訊後的資訊的字首;
setAfterMessageSuffix:日誌資訊後的資訊的字尾。
以上這些資訊均可以在init-param中進行設定。
日誌資訊在getBeforeMessage和getAfterMessage方法中通過createMessage建立,然後被doFilterInternal呼叫,日誌資訊中至少包含uri資訊,其他資訊則根據init-param中所設定的值獲取,例如,當includeQueryString的值為true時,日誌資訊中除uri資訊外,還包含query string資訊。
由此可以,在spring中已定義的AbstractRequestLoggingFiter的子類過濾器均是用於輸入上下文資訊,只不過承載的方式不同,其中CommonsRequestLoggingFilter將上下文資訊直接列印;ServletContextRequestLoggingFilter將上下文資訊寫入日誌檔案;Log4jNestedDiagnosticContextFilter將上下文資訊寫入NDC中。