项目源码 本文章主要记录controller层的访问记录
AOP
通知(Advice) 前置通知(Before):在目标方法调用前调用通知功能; 后置通知(After):在目标方法调用之后调用通知功能,不关心方法的返回结果; 返回通知(AfterReturning):在目标方法成功执行之后调用通知功能; 异常通知(AfterThrowing):在目标方法抛出异常后调用通知功能; 环绕通知(Around):通知包裹了目标方法,在目标方法调用之前和之后执行自 定义的行为。
连接点(JoinPoint) 通知功能被应用的时机。比如接口方法被调用的时候就是日志切面的连接点。
切点(Pointcut) 切点定义了通知功能被应用的范围。比如日志切面的应用范围就是所有接口,即 所有controller层的接口方法。
切面(Aspect) 切面是通知和切点的结合,定义了何时、何地应用通知功能。
引入(Introduction) 在无需修改现有类的情况下,向现有的类添加新方法或属性。
织入(Weaving) 把切面应用到目标对象并创建新的代理对象的过程。
常用注解
@Aspect:用于定义切面@Before:通知方法会在目标方法调用之前执行@After:通知方法会在目标方法返回或抛出异常后执行@AfterReturning:通知方法会在目标方法返回后执行@AfterThrowing:通知方法会在目标方法抛出异常后执行@Around:通知方法会将目标方法封装起来@Pointcut:定义切点表达式
切点表达式
execution(方法修饰符 返回类型 方法所属的包.类名.方法名称(方法参数)
定义日志类
@Data
public class WebLog {
private String description
;
private String username
;
private Long startTime
;
private Integer spendTime
;
private String basePath
;
private String uri
;
private String url
;
private String method
;
private String ip
;
private Object parameter
;
private Object result
;
}
定义切面类
@Component
@Aspect
@Order(1)
public class WebLogAspect {
private static final Logger LOGGER
= LoggerFactory
.getLogger(WebLogAspect
.class);
@Pointcut("execution(public * com.keyou.controller.*.*(..))")
public void webLog() {
}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint
) throws Throwable
{
}
@AfterReturning(value
= "webLog()", returning
= "ret")
public void doAfterReturning(Object ret
) throws Throwable
{
}
@Around("webLog()")
public Object
doAround(ProceedingJoinPoint joinPoint
) throws Throwable
{
long startTime
= System
.currentTimeMillis();
ServletRequestAttributes attributes
= (ServletRequestAttributes
) RequestContextHolder
.getRequestAttributes();
HttpServletRequest request
= attributes
.getRequest();
WebLog webLog
= new WebLog();
Object result
= joinPoint
.proceed();
Signature signature
= joinPoint
.getSignature();
MethodSignature methodSignature
= (MethodSignature
) signature
;
Method method
= methodSignature
.getMethod();
if (method
.isAnnotationPresent(ApiOperation
.class)) {
ApiOperation annotation
= method
.getAnnotation(ApiOperation
.class);
webLog
.setDescription(annotation
.value());
}
long endTime
= System
.currentTimeMillis();
String urlStr
= request
.getRequestURL().toString();
webLog
.setBasePath(StrUtil
.removeSuffix(urlStr
, URLUtil
.url(urlStr
).getPath()));
webLog
.setUsername(request
.getRemoteUser());
webLog
.setIp(request
.getRemoteAddr());
webLog
.setMethod(request
.getMethod());
webLog
.setParameter(joinPoint
.getArgs());
webLog
.setResult(result
);
webLog
.setSpendTime((int) (endTime
- startTime
));
webLog
.setStartTime(startTime
);
webLog
.setUri(request
.getRequestURI());
webLog
.setUrl(request
.getRequestURL().toString());
LOGGER
.info("{}", JSONUtil
.parse(webLog
));
return result
;
}
private Object
getParameter(Method method
, Object
[] args
) {
List
<Object> argList
= new ArrayList<>();
Parameter
[] parameters
= method
.getParameters();
for (int i
= 0; i
< parameters
.length
; i
++) {
RequestBody requestBody
= parameters
[i
].getAnnotation(RequestBody
.class);
if (requestBody
!= null
) {
argList
.add(args
[i
]);
}
RequestParam requestParam
= parameters
[i
].getAnnotation(RequestParam
.class);
if (requestParam
!= null
) {
Map
<String, Object> map
= new HashMap<>();
String key
= parameters
[i
].getName();
if (!StringUtils
.isEmpty(requestParam
.value())) {
key
= requestParam
.value();
}
map
.put(key
, args
[i
]);
argList
.add(map
);
}
}
if (argList
.size() == 0) {
return null
;
} else if (argList
.size() == 1) {
return argList
.get(0);
} else {
return argList
;
}
}
}