统一获取请求的地址和参数,打印到日志和控制台中,方便查找错误

有时候我们需要知道前台的请求地址和请求的参数、返回值等信息,来帮助我们解决问题。
下面就介绍一下如何获取请求的参数和返回参数等:

@Aspect
@Component
@Slf4j
public class ConsoleLogAspect {

	//设置切面点(切面地址根据自己的项目填写)
    @Pointcut(value = "(execution(* com.zte.bcp.manage..controller.*.*(..)))")
    public void webLog() {}

	//指定切点前的处理方法
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Exception {
    	//获取request对象
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        StringBuilder sb = new StringBuilder();
        //拼接请求内容
        sb.append("\n请求路径:" + request.getRequestURL().toString() + "  " + request.getMethod() + "\n");
        //判断请求是什么请求
        if (request.getMethod().equalsIgnoreCase(RequestMethod.GET.name())) {
            Map parameterMap = request.getParameterMap();
            Map paramMap = new HashMap<>();
            parameterMap.forEach((key, value) -> paramMap.put(key, Arrays.stream(value).collect(joining(","))));
            sb.append("请求内容:" + JSON.toJSONString(paramMap));
        } else if (request.getMethod().equalsIgnoreCase(RequestMethod.POST.name())) {
            Object[] args = joinPoint.getArgs();
            StringBuilder stringBuilder = new StringBuilder();
            Arrays.stream(args).forEach(object -> stringBuilder.append(object.toString().replace("=",":")));
            if (stringBuilder.length() == 0){
                stringBuilder.append("{}");
            }
            sb.append("请求内容:" + stringBuilder.toString());
        }
        log.info(sb.toString());
    }
    
	//指定切点前的处理方法
    @AfterReturning(pointcut = "webLog()",returning = "result")
    public void doAfterReturning(Object result) {
        if (ObjectUtils.isEmpty(result)){
            return;
        }
        log.info("\n返回結果:" + JSON.toJSONString(result));
    }
}

这样就可以实现打印请求参数和响应内容了

你可能感兴趣的:(springboot)