java aspect 切面怎麼獲取 POST 數據
/**
* 切面 ,記錄日誌
*/
@Aspect
@Component
public class PostRequestBodyAspect {
@Pointcut("execution(* com.example.controller.*.*(..))")
public void controllerMethods() {}
@Around("controllerMethods() && args(.., @RequestBody requestBody)")
public Object aroundControllerMethods(ProceedingJoinPoint joinPoint, Object requestBody) throws Throwable {
// 在這裏獲取到 POST 請求體中的參數
// requestBody 就是 POST 請求體中的參數
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String data=getFormData(request,requestBody);
Date startDate=new Date();
try {
// 執行原始方法
Object result = joinPoint.proceed();
// 可以對原始方法的返回值進行攔截和修改
return result;
} catch (Exception e) {
// 處理異常情況
throw e;
} finally {
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttribute())
.getResponse();
Date endDate=new Date();
// 獲取並處理Response對象
System.out.println("Response Status Code: " + response.getStatus());
System.out.println("Response Content Type: " + response.getContentType());
System.out.println("Response Body: " + response.getWriter().toString());
//寫入日誌到數據庫
Int responseStatue=request.getStatus();
Long costTime=endDate.getTime()-startDate.getTime(); //耗時
}
}
/**
* 獲取POST GET的data數據
* @param request
* @return大
*/
private static String getFormData(HttpServletRequest request,object requestBody) {
if("POST".equalsIgnoreCase(request.getMethod())){
if(requestBody==null){
return "";
}
else if(requestBody instanceof BeanPropertyBindResult ){
return JSONObject.toJSONString(((BeanPropertyBindResult)requestBody).getTarget());
}else {
return JSONObject.toJSONString(requestBody);
}
}
String data = request.getParameterMap().entrySet().stream().map(entry -> {
String result;
String[] value = entry .getvalue();
if (value != null && value.length > 1) {
result = Anrays.stream(value).map(s -> entry.getkey() + "=" + s).collect(Collectors.joining( "&"));
}else {
result = entry.getKey() + "=" + value[o];
}
return result;
}).collect(Collectors.joining( "&"))
return data;
}
}