通過反射獲取上傳檔案方法引數中的檔名

小魚萌萌發表於2022-01-11

  最近系統在做安全測評,要求所有資料操作都要保留操作痕跡,於是PM要求所有介面按照增加、修改、查詢、刪除、匯出、匯入、審批、檔案上傳下載刪除這幾大操作型別統一增加日誌。這一需求的典型實現方法是給Controller層的介面加上自定義註解,通過AOP攔截所有方法來實現。我實現的這個自定義註解傳入的引數有menu選單名、title運算元據說明及操作型別,記錄格式一般是:使用者名稱+操作型別+選單+運算元據說明+獲取的引數資訊。下面簡單說一下其中的邏輯。

1.增加:單條新增資料的方法統一返回新增記錄id,根據攔截到的方法返回值獲取id記錄

2.刪除:迴圈request中的引數獲取到id並記錄

Enumeration enu=request.getParameterNames();
while(enu.hasMoreElements()){
  String paraName=(String)enu.nextElement();
  Object paramVal1 = request.getParameter(paraName);
  if(paramVal1 != null && !"".equals(paramVal1.toString())){
  sb.append(paraName+"為"+paramVal1+";");
  }
}

3.查詢:一般是GET請求也是迴圈request中的引數獲取查詢條件,這裡注意引數有的放在request裡,有的是如queryXXX/id 這種直接放在請求路徑上的,

String paraName=(String)enu.nextElement();
// 解析查詢路徑傳參的情況,如 url/{id}
if ("_".equals(paraName)){
Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
String idInPath = (String) pathVariables.get("id");
if (idInPath != null) {
sb.append("id為"+idInPath+";");
}
}
4.修改/匯出操作:預設也是根據request獲取資訊,但是我的POST請求型別是通過joinPoint.getArgs()獲取的
StringBuffer exportStr = new StringBuffer();
String title = operLog.getTitle();
// 統計報表專用(因為所有統計報表公用一個匯出介面)
Object[] args = joinPoint.getArgs();
if ("統計報表".equals(controllerLog.menu()) && args.length>0){
Map arguMap = (Map) args[0];
title = arguMap.get("reportName")+"穿透";
exportStr.append("tn為").append(arguMap.get("tn"))
.append("exportMode為").append(arguMap.get("exportMode"));
}
5.檔案上傳、下載、刪除
我的檔案上傳是通過WebUploader元件實現的,上傳檔案記錄了檔名,而下載和刪除檔案都只記錄了檔案id。注意這裡有個小坑,Controller中獲取檔名是直接將HttpServletRequest請求對映為MultipartHttpRequest實現的:
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
通過反射獲取到request之後再這樣寫就報錯:cannot be cast to org.springframeworkweb.multipart.MultipartHttpServletRequest
於是查了一下發現需要通過MultipartResolver轉一下:
MultipartResolver resolver = new StandardServletMultipartResolver();
MultipartHttpServletRequest multiRequest = resolver.resolveMultipart(request);
這個具體原理大家可以查詢,其他方式實現的檔案上傳不一定適用此方法。
感興趣的朋友可以留言跟我要相關程式碼及資料表

相關文章