业务场景:项目拆分微服务,恰巧鄙人负责几个基础的服务,各种对接其他服务。到后期运维,接各种锅:我调用你接口了,你那数据不对。我传递是这个参数,你那处理的有问题......。只好加上日志记录,业务场景就是:防止背锅!
1.定义注解
package com.haier.hwork.qwrgqk.business.annotation; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface OperationLog { String value() default ""; //1-增删改,2-查询,默认是1 int type() default 1; }
2.定义AOP
@Aspect @Component public class OperationLogAspect { @Autowired private TlOperationLogDao tlOperationLogDao; //扫描使用这个注解的方法 @Pointcut("@annotation(com.haier.hwork.qwrgqk.business.annotation.OperationLog)") public void logPointCut() {} @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { Date beginTime=new Date(); String result=null; String status=null; //执行代码,都加try catch,即使出错也不能影响主进程 try { Object obj = point.proceed();//放行请求的主进程并拿到返回值 if(obj!=null) { result=JSONObject.toJSONString(obj); } status="success"; return obj; } catch (Exception e) { //请求执行出错 result=e.getMessage(); status="error"; throw e; } finally { //无论成功失败,都保存下日志 saveLog(point, beginTime, new Date(), result, status); } } //保存日志 private void saveLog(ProceedingJoinPoint joinPoint, Date beginTime, Date endTime, String result, String status) { TlOperationLog tlOperationLog=new TlOperationLog(); try { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); OperationLog annotation = method.getAnnotation(OperationLog.class); int type=1;//注解类型 if (annotation != null) { //注解上的描述 tlOperationLog.setOperateModule(annotation.value()); //注解类型 tlOperationLog.setOperateType(String.valueOf(annotation.type())); type=annotation.type(); } //记录入参 if(joinPoint.getArgs()!=null) { try { tlOperationLog.setParam(JSONObject.toJSONString(joinPoint.getArgs())); } catch (Exception e) { e.printStackTrace(); } } //如果注解类型是1(增删改)或者是2(查询)报错,记录返回值,如果是查询正常就不记录,有可能返回值太多 if(type==1 || "error".equals(status)) { tlOperationLog.setResult(result); } tlOperationLog.setStartTime(beginTime);//记录请求开始时间 tlOperationLog.setEndTime(endTime);//记录请求结束时间 tlOperationLog.setStatus(status);//记录执行状态 HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); if (request != null) { tlOperationLog.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));//记录请求头信息 tlOperationLog.setUserCode(request.getHeader(Constant.HEADER_CURRENT_USER));//获取登录人,登录信息放在了header里 if(request.getRequestURL()!=null) {//记录请求地址 tlOperationLog.setUrl(request.getRequestURL().toString()); } } } catch (Exception e) { e.printStackTrace(); } //启动一个线程,执行报错日志,防止影响主请求 new Thread() { @Override public void run() { try { //保存数据到数据库 tlOperationLogDao.insertSelective(tlOperationLog); } catch (Exception e) { e.printStackTrace(); } } }.start(); } }
3.配置需要记录日志的方法
@PostMapping("/save") @OperationLog("新增APP TOKEN管理") public BaseResponse save() { return ResponseMsgUtil.success(tsSysAppTokenService.save()); } 凡是加上OperationLog注解的方法,都会记录日志,注解参数需要一个描述当前方法的字符串,会记录到数据库中。 另外还需要参数type,非必填,默认1,代表是增删改,type=2代表查询。
@OperationLog("新增APP TOKEN管理") @OperationLog(value="查询管理客户接口", type=2)
相关推荐
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...
springboot+拦截器+aop+自定义注解+本地线程实现统一接口日志记录,记录下接口所在模块、接口描述、接口请求参数、接口返回参数、接口请求时间以及接口耗时用于接口优化,接口记录参数以及操作人防止使用人员误操作...
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
使用SpringBoot通过自定义注解+AOP+全局异常处理实现参数统一非空校验
使用springboot框架引入mybatis连接mysql数据库(xml和注解两种方式实现sql语句),最后用thymeleaf展示数据。
本demo适合刚入门学习SpringBoot及Vue的小伙伴,要求有SSM基础,较熟悉web应用三层架构,且对前端的html\css\js有一定的基础,会写ajax等基础的前后端交互请求。 本demo实现了简单的登录、注册、获取用户信息三个...
2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个SpringBoot项目 2.1 引入 POM 依赖 2.1.1 引入springboot aop依赖 2.1.2 引入fastjson依赖 2.2 .编写配置类SpringConfig.java 2.3.编写测试Controller 2.4 编写切面类...
idea+springboot+jsp+mybatis+mapper注解
本项目集成了springboot+security+mybatis+redis+jwt用于学习security鉴权功能,其中有...项目搭建已经比较成熟,能够直接进行使用,通过代码可以学习security的权限配置,菜单权限,注解权限等 有学习SPI机制的学习
springboot+mybatis+mysql实现读写分离 先在建好mysql主从数据库的配置,然后在代码中根据读写分离或强制读取master数据库中的数据 mysql数据库设置主从,参考: ...
日志表:使用aop拦截实现 权限控制:基于token方式,禁用session 对各种不同异常进行了全局统一处理 使用lombok简化java代码,让源码更简洁,可读性高 mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂...
SpringBoot,注解实现Redis 库的切换。
非常适合刚学习springboot的初学者用了学习springboot+mybatis+layui+shiro 权限注解-后台的完整的项目整合 后台的账号密码 admin-111111
springboot + layuiadmin构建的单体后台管理系统源码 1、推荐使用IDEA开发工具运行此项目 2、在mysql中创建crud...4.在JAVA方法中加入@CrudLog注解可以将用户操作后台管理系统中操作日志记录到数据库sys_log日志表中
主要介绍了SpringBoot使用AOP+注解实现简单的权限验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
shiro+springboot2.x+redis注解方式完整项目,包括自定义realm,整合redis缓存管理器,自定义sessionId,自定义session等等,sql文件就在resource文件夹下
采用eclipse tomcat8.0 以及jdk1.8快速整合的SpringBoot+maven+MyBatis注解框架包含操作文档( https://blog.csdn.net/qq_34492495/article/details/82992094)
史上最全SpringBoot注解(整合+详解) - 知乎.html
3、SpringBoot框架,注解使用 4、thymeleaf模板的配置,常用标签的使用,if,for,include,replace标签 6、用户管理:新增,修改,删除,查询功能 9、页面功能由html+thymeleaf实现 10、数据库脚本及数据在项目源...
【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现