###### tags:`Gateweb` Audit Log Modify === 目標 --- * 記錄ibon端的重要操作 * 可以從該頁面查詢ibon端進行了哪些操作 現有環境 --- 已有現存logData table做為行為記錄,但其欄位並不完整 也有現有的查詢頁面:/backendAdmin/logSearchServlet #### logData欄位 * session_obj(為session的map資料) * log_id(流水號) * user_name(使用者名稱) * request_obj(request的parameter) * log_url(request的url) * parameter_id(與request url相符的log_parameter) * access_time(存取時間) #### logParameter欄位 * log_pattern * action_name * parameter_id ``` SELECT ldata.log_id ,ldata.log_url ,ldata.access_time ,ldata.user_name ,ldata.request_obj ,ldata.session_obj ,lparameter.action_name FROM log_data ldata JOIN log_parameter lparameter ON ldata.parameter_id = lparameter.parameter_id WHERE 1 = 1 ``` 從現有欄位看來,user_id並沒有記錄在任何一個欄位中 而log_parameter的功能就只是與action_name進行橋接,以便有中文可以看是什麼操作 第一階段調整 --- 直接使用現有的機制與查詢頁面,但做一些調整: * 在request_obj的欄位中加入user_id以便之後查詢 * 區分一般的request及multipart request(會在技術細節中提及) * 修正ibon類型的url,讓原本使用參數進行分辨的url有區別 * 在原本的網址中有幾個case * /backendAdmin/ibonPrizeNoteServlet?method=search * /backendAdmin/ibonPrizeNoteServlet?method=download * 這種類型的網址光從url是沒有辦法分辨,需要細看request_obj才會知道,因此直接修正為以下的樣子 * /backendAdmin/ibonPrizeNoteServlet/search * /backendAdmin/ibonPrizeNoteServlet/download * 將原本的查詢頁面中的action_name欄位改為顯示request_url * 從原本查詢頁面的join來看,沒有join到的log是不會顯示的 * ***原本應該要做的把"userid放到顯示頁面中"可能考慮到下一個階段加欄位再做*** #### 第一階段技術細節 有一個基礎的request interface為httpServletRequest 而若其包含MultipartFile時會是另一個類別DefaultMultipartHttpServletRequest 但依然實作httpServletRequest 這兩個servletRequest取得的parameterMap不太一樣,雖然multipart有multipartFile的資訊,但卻不是記錄在parameterMap(這個資訊會存到request_obj當中) 而是在另一個multipartFile的property中 雖然可以選擇不記錄multipartFile的內容,但只有url跟request只會把formSubmit的非檔案欄位放到request_obj當中,因而看不到檔案名稱,實際手測時的狀況其實不太好用,記錄的資訊過少 也因此將原本的只對httpServletRequest的實作改為兩種實作來產生LogData 也就是會有以下幾個class * WebAuditLoggerInterceptor * AuditLogDataGenerator(Interface) * AuditLogDataProvider * GeneralLogDataGenerator * MultipartFileInfo * MultipartLogDataGenerator #### 流程圖 ```flow wali=>start: WebAuditLoggerInterceptor aldp=>condition: isMultipartServletRequest sv=>operation: saveLog gldg=>operation: GeneralLogDataGenerator mldg=>operation: MultipartLogDataGenerator end=>end: EndPointServlet wali->aldp aldp(yes)->mldg->sv->end aldp(no)->gldg->sv->end ``` #### 總結 考量到原實作就是如此,應盡量貼近實際關系 上圖的GeneralLogDataGenerator及MultipartLogDataGenerator都是實作 AuditLogDataGenerator,但產生的內容不太一樣,MultipartLogDataGenerator會另外把MultipartFile的Filename寫到request_obj當中作為額外的資訊 但兩個都會寫入user_id到request_obj當中