废话就很少说了直接上代码:web
/** * Controller层AOP,记录请求和返回结果日志扫描controller日志 * * @author reasahi * @version 1.0.0 */ @Aspect @Component public class WebLogAspect { /** * 日志 */ private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); @Resource private MappingJackson2HttpMessageConverter converter; /** * 同步计算每次请求时间 */ ThreadLocal<Long> startTime = new ThreadLocal<>(); // 要扫描多个Controller 使用这种方式进行处理,若是你的包里面分了多个Controller;若是只有一个删除一个execution留一个就好了 @Pointcut("execution(public * com.exclmpl.controller.*.*(..)) || execution(public * com.exclmpl.webController.*.*(..))") public void webLog() { } @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { startTime.set(System.currentTimeMillis()); // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 logger.info("请求链接 : " + request.getRequestURL().toString()); logger.info("请求方式 : " + request.getMethod()); logger.info("请求IP: " + IpHost.getIpAddr(request)); logger.info("请求类: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); // logger.info("请求参数 : " + params); logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs())); } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容 logger.info("请求返还内容 : " + ret); logger.info("耗时 : " + (System.currentTimeMillis() - startTime.get()) + "毫秒"); } @Around(value = "webLog()") @ResponseBody public void formatResult2JSON(ProceedingJoinPoint pjp) throws Throwable { HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); HttpOutputMessage outputMessage = new ServletServerHttpResponse(response); //移除全部字段为null的字段,其实就是使用了toString 以后移除 全部的null字段,可是这样处理的后果就是全部返还字段内不能带有null这样小写的字段,不然将会所有被移替换掉 String result=pjp.proceed().toString().replaceAll("null", "\"\""); converter.write(JSONObject.fromObject(result), MediaType.APPLICATION_JSON_UTF8, outputMessage); shutdownResponse(response); } @AfterThrowing(pointcut = "webLog()", throwing = "error") public void handleForException(JoinPoint jp, Throwable error) throws Throwable { HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); HttpOutputMessage outputMessage = new ServletServerHttpResponse(response); //这里可能会报错,缘由是由于你在 try ctah模块里面用
e.printStackTrace();
若是你不须要正式环境下有这个,那么最好注销或者使用e.getMessage();app
converter.write(JSONObject.fromObject(error.getMessage()), MediaType.APPLICATION_JSON_UTF8, outputMessage); shutdownResponse(response); } private void shutdownResponse(HttpServletResponse response) throws IOException { response.getOutputStream().close(); } }