java aspect 切面怎麼獲取 POST 數據

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

}

 

來源:java 切面獲取post請求體

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章