package com.example.demo.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.logging.Logger; /** * Create by szw on 2017/11/29 17:22 */ /** * 切面 */ @Aspect @Component public class WebLogAspect { private Logger logger = Logger.getLogger(String.valueOf(getClass())); ThreadLocal<Long> startTime = new ThreadLocal<>(); /** * 切点表达式 */ @Pointcut("execution(public * com.example.demo.web..*.*(..))") 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("URL:"+request.getRequestURL().toString()); logger.info("HTTP_METHOD:" + request.getMethod()); logger.info("IP:"+request.getRemoteAddr()); logger.info("CLASS_METHOD:" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); logger.info("ARGS:" + Arrays.toString(joinPoint.getArgs())); logger.info("SPEND TIME : " + (System.currentTimeMillis() - startTime.get())); } /** * 返回后通知 * @param ret * @throws Throwable */ @AfterReturning(returning = "ret",pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable{ /** * 处理完请求,记录返回内容 */ logger.info("RESPONSE:"+ret); } }
怎么aop中实现记录请求访问时间:用ThreadLocal
最新推荐文章于 2023-03-26 21:34:27 发布