/** * 操作日志aop */
@Slf4j @Aspect @Component public class OperateLogAspect {
private static final String OPERATE_LOG_ID = "operateLogId";
@Autowired private SysOperateLogService sysOperateLogService;
/** * 切点: @annotation 表示持有“cn.XXXX.annotation.OperateLog”注解的方法都将执行aop的通知 */ @Pointcut("@annotation(cn.xiweiai.dc.web.admin.annotation.OperateLog)") public void pointcut() { // }
/** * 定义前置通知 */ @Before("pointcut()") public void before(JoinPoint point) { HttpServletRequest request = ServletRequestAttributesUtils.getHttpServletRequest(); SysOperateLog operateLog = new SysOperateLog(); //组装操作日志 if (CurrentUserUtils.isLogin()) { operateLog.setUserId(CurrentUserUtils.getCurrentUserId()); } OperateLog annotation = getOperateLog(point); operateLog.setModuleName(annotation.module()); operateLog.setFunctionName(annotation.function()); operateLog.setReqUrl(request.getRequestURI()); operateLog.setIp(request.getRemoteAddr()); operateLog.setReqBody(getReqBody(point)); operateLog.setCreateTime(new Date()); //保存操作日志 sysOperateLogService.add(operateLog); //将该条日志的id放入request域,为后续使用做准备 request.setAttribute(OPERATE_LOG_ID, operateLog.getId()); }
/** * 后置返回通知 * * @param result */ @AfterReturning(pointcut = "pointcut()", returning = "result") public void afterReturning(Object result) { HttpServletRequest request = ServletRequestAttributesUtils.getHttpServletRequest(); Long operateLogId = (Long) request.getAttribute(OPERATE_LOG_ID); if (operateLogId == null) { log.error("operateLogId为空"); return; } String respBody = null; if (result != null) { try { respBody = ObjectMapperUtils.writeValueAsString(result); } catch (JsonParseException e) { log.error(e.getMessage(), e); } } SysOperateLog operateLog = new SysOperateLog(); operateLog.setId(operateLogId); operateLog.setRespBody(respBody); operateLog.setUpdateTime(new Date());
if (CurrentUserUtils.isLogin()) { operateLog.setUserId(CurrentUserUtils.getCurrentUserId()); } //后置通知:更新日志 sysOperateLogService.update(operateLog); }
private OperateLog getOperateLog(JoinPoint point) { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); return method.getAnnotation(OperateLog.class); } /** * 获取请求body参数 请求参数获取后,会变成空null,进行封装请求参数,保证后续使用能够获取到。 * * @param point * @return */ private String getReqBody(JoinPoint point) { String reqBody = null; try { Map<String, Object> params = WebUtils.getParams(); if (CollectionUtils.isEmpty(params)) { return null; } Class<? extends OperateLogHandler> clazz = getOperateLog(point).handler(); if (clazz != null && !clazz.isAssignableFrom(OperateLogHandler.class)) { reqBody = clazz.newInstance().handler(params); } else { reqBody = ObjectMapperUtils.writeValueAsString(params); } } catch (Exception e) { log.error(e.getMessage(), e); } return reqBody; } }
|