SpringBoot2.X,使用 自定义注解 + SpringAOP来记录系统操作日志
其他
2019-09-16 16:44:31
阅读次数: 0
1:自定义一个操作日志的注解
/** * 操作日志注解 */ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface OperateLog {
/** * 模块名称 * * @return */ String module();
/** * 操作名称 * * @return */ String function();
/** * 过滤敏感词 * * @return */ Class<? extends OperateLogHandler> handler() default OperateLogHandler.class;
} |
2:操作日志的AOP
/** * 操作日志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; } } |
3:日志类
/** * 系统操作日志表 * @date 2019-08-27 */ @Data @Entity @Table(name = "dc_sys_operate_log") public class SysOperateLog {
@Id @GeneratedValue(generator = "JDBC") private Long id;
/** * 组织id */ private Long userId;
/** * 模块名称 */ private String moduleName;
/** * 功能名称 */ private String functionName;
/** * 请求url */ private String reqUrl;
/** * 登录名 */ private String ip;
/** * 请求body(包含url参数) */ private String reqBody;
/** * 响应body */ private String respBody;
/** * 密码 */ private String detail;
/** * 创建时间 */ private Date createTime;
/** * 更新时间 */ private Date updateTime;
} |
4:调用AOP
/** * 系统用户控制器(成员管理) */ @Slf4j @RestController @RequestMapping(value = "/user", produces = APPLICATION_JSON_UTF8_VALUE) public class SysUserController {
@Autowired private SysUserService sysUserService;
/** * 系统用户列表 * * @param dto * @return */ @OperateLog(module = "用户管理", function = "用户列表") @RequiresPermissions(USER_LIST) @PostMapping(value = "/list") public DabResponse list(@Valid @RequestBody QuerySysUserListReqDTO dto) {
return success(sysUserService.getQuerySysUserListRespDTO(dto)); }
/** * 修改用户信息 * * @param dto * @return */ @OperateLog(module = "用户管理", function = "修改用户信息") @RequiresPermissions(USER_LIST) @PostMapping(value = "/update") public DabResponse update(@Valid @RequestBody SysUserUpdateDTO dto) { sysUserService.update(dto); return success(); }
/** * 修改用户状态 * * @param dto * @return */ @OperateLog(module = "用户管理", function = "修改用户状态") @RequiresPermissions(USER_LIST) @PostMapping(value = "/update/status") public DabResponse updateStatus(@Valid @RequestBody SysUserUpdateStatusDTO dto) { sysUserService.updateStatus(dto); return success(); }
} |
转载自www.cnblogs.com/shsgshn/p/11528027.html