maven依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
創建注解類
package com.avivacofco.epidemic.aop; import java.lang.annotation.*; /** * @author :jerry_wei * @date :Created in 2020/5/25 17:41 * @description:請求日志 * @modified By: * @version: */ //注解聲明周期 @Retention(RetentionPolicy.RUNTIME) //注解 修飾方法 @Target(ElementType.METHOD) @Documented public @interface ResLog { //接口描述 String desc() default ""; }
配置內容
package com.avivacofco.epidemic.aop; import com.alibaba.fastjson.JSON; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; 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.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; /** * @author :jerry_wei * @date :Created in 2020/5/25 17:44 * @description: * @modified By: * @version: */ @Aspect @Component public class AopConfig { private static Logger logger = LoggerFactory.getLogger(AopConfig.class); @Pointcut("@annotation(com.avivacofco.epidemic.aop.ResLog)") public void resLog(){ } @Around("resLog()") public Object around(ProceedingJoinPoint pjp){ long begin = System.currentTimeMillis(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); Signature signature = pjp.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); ResLog resLog = method.getAnnotation(ResLog.class); String desc = resLog.desc(); //可以添加日志表 //記錄用戶 軌跡 // 先進 filter 在進 interceptor 最后進 aop // 可以通過 token 攔截,然后 通過token 獲取用戶數據 在aop 中 獲取 user 數據 logger.info("請求開始"); logger.info("請求連接 {}",request.getRequestURL().toString()); logger.info("接口描述 {}",desc); logger.info("請求類型 {}",request.getMethod()); logger.info("請求方法 {}.{}",signature.getDeclaringTypeName(),signature.getName()); logger.info("請求ip {}",request.getRemoteAddr()); logger.info("請求入參 {}", JSON.toJSONString(pjp.getArgs())); logger.info("請求token {}",request.getHeader("sso-token")); Object result = null; try { result = pjp.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } long end = System.currentTimeMillis(); logger.info("請求耗時 {}",end-begin); logger.info("請求返回 {}",JSON.toJSON(result)); logger.info("請求結束"); return result; } }
正常使用
@ResLog(desc = "閱讀消息接口") @PostMapping ("/read") public Map read(@RequestBody Map resMap){ return remindService.read(resMap); }