<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);
}
原文:https://www.cnblogs.com/jerry-wei/p/13023901.html