package cc.mrbird.febs.common.aspect; import cc.mrbird.febs.common.annotation.ControllerEndpoint; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.FebsUtil; import cc.mrbird.febs.monitor.service.ILogService; import cc.mrbird.febs.system.entity.User; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import java.lang.reflect.Method; /** * @author MrBird */ @Slf4j @Aspect @Component @RequiredArgsConstructor public class ControllerEndpointAspect extends BaseAspectSupport { private final ILogService logService; @Pointcut("@annotation(cc.mrbird.febs.common.annotation.ControllerEndpoint)") public void pointcut() { } @Around("pointcut()") public Object around(ProceedingJoinPoint point) throws FebsException { Object result; Method targetMethod = resolveMethod(point); ControllerEndpoint annotation = targetMethod.getAnnotation(ControllerEndpoint.class); String operation = annotation.operation(); long start = System.currentTimeMillis(); try { result = point.proceed(); if (StringUtils.isNotBlank(operation)) { RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes; String ip = StringUtils.EMPTY; if (servletRequestAttributes != null) { ip = servletRequestAttributes.getRequest().getRemoteAddr(); } // 设置操作用户 User user = (User) SecurityUtils.getSubject().getPrincipal(); logService.saveLog(user, point, targetMethod, ip, operation, start); } return result; } catch (Throwable throwable) { log.error(throwable.getMessage(), throwable); String exceptionMessage = annotation.exceptionMessage(); String message = throwable.getMessage(); String error = FebsUtil.containChinese(message) ? exceptionMessage + "," + message : exceptionMessage; throw new FebsException(error); } } }