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请求体

 

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