打印请求参数
可以利用springboot 的aop切面去实现
package com.track.able.config;
import com.track.able.util.JsonUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* TODO 返回值日志打印
*
* @ClassName LogRecordAspect
* @Description TODO
* @Author tang mi
* @Date 2020/1/9 上午 10:29
* @Version 1.0
**/
@Aspect
@Configuration
public class LogRecordAspect {
private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class);
/**
* TODO 定义切点Pointcut
*
* @return void
* @Author tang mi
* @Description TODO
* @Date 2020/1/9 上午 10:51
*/
@Pointcut("execution(* com.track.able..*.*Controller.*(..))")
public void executionService() {
}
/**
* TODO 根据切点打印返回值日志
*
* @param proceedingJoinPoint
* @return java.lang.Object
* @throws
* @Author tang mi
* @Description TODO
* @Date 2020/1/9 上午 10:51
*/
@Around("executionService()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Map<String, Object> fieldsName = getFieldsName(proceedingJoinPoint);
boolean flag = true;
if (fieldsName != null) {
for (Map.Entry<String, Object> obj : fieldsName.entrySet()) {
Object value = obj.getValue();
//这里需要过滤导入导出等参数接口 如果不过滤则打印json时会报错 踩坑后补上的逻辑
//测试只需要将接口中的参数加入 一下三个参数中的一个即可(注释到下面的判断)测试出结果
//当然这个目前项目中只有这三种不能打印,其他的没有一一测试,以实际为准
if (value instanceof MultipartFile || value instanceof HttpServletRequest || value instanceof HttpServletResponse) {
flag = false;
}
}
}
if (flag) {
logger.info("请求参数为:{}", JsonUtils.objToJson(fieldsName));
}
// result的值就是被拦截方法的返回值
Object result = proceedingJoinPoint.proceed();
logger.info("请求结束,controller的返回值是:{}", JsonUtils.objToJson(result));
return result;
}
/**
* TODO 根据切面获取请求参数列表
*
* @param joinPoint
* @return java.util.Map<java.lang.String, java.lang.Object>
* @throws
* @Author tang mi
* @Description TODO
* @Date 2020/1/13 下午 02:09
*/
private static Map<String, Object> getFieldsName(ProceedingJoinPoint joinPoint) {
// 参数值
Object[] args = joinPoint.getArgs();
ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String[] parameterNames = pnd.getParameterNames(method);
Map<String, Object> paramMap = new HashMap<>(32);
if (parameterNames != null) {
for (int i = 0; i < parameterNames.length; i++) {
paramMap.put(parameterNames[i], args[i]);
}
}
return paramMap;
}
}