1,开发环境
操作系统:Windows 7
JDK:1.8.0_161
Eclipse:Mars.2 Release (4.5.2)

2,自定义注解类UserLog

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserLog {/** 要执行的操作内容比如:用户:XXX登录成功 **/public String operationContent() default "";
}

3,日志处理切面UserLogAspect
这里使用的是后通知,当业务代码执行完成后,再执行日志保存。

@Aspect
@Component
public class UserLogAspect {@Autowiredprivate ILogSysUserService logSysUserService;//Controller层切点  @Pointcut("@annotation(com.riskraider.common.annotation.UserLog)")public void controllerAspect() {}/** * 前置通知 用于拦截Controller层记录用户的操作 * * @param joinPoint 切点 */ @SuppressWarnings("rawtypes")@After("controllerAspect()")public void doAfter(JoinPoint joinPoint) {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();HttpSession session = request.getSession();//读取session中的用户SysAccount account = (SysAccount) session.getAttribute("account");if(null != account){//获取请求ipString ip = request.getRemoteAddr();try{String targetName = joinPoint.getTarget().getClass().getName();String methodName = joinPoint.getSignature().getName();Object[] arguments = joinPoint.getArgs();Class targetClass = Class.forName(targetName);Method[] methods = targetClass.getMethods();String operationUrl = request.getServletPath();String operationContent = "";for (Method method : methods) {if (method.getName().equals(methodName)) {Class[] clazzs = method.getParameterTypes();if (clazzs.length == arguments.length) {//凡是加了UserLog注解的方法都记录日志if(null != method.getAnnotation(UserLog.class)){operationContent = method.getAnnotation(UserLog.class).operationContent();//获取用户请求方法的参数并序列化为JSON格式字符串    Map<String,Object> nameAndArgs = null;if(null != joinPoint.getArgs() && joinPoint.getArgs().length > 0) {//获取参数名称和值  nameAndArgs = getParameMap(joinPoint);}SysUserLogDTO log = new SysUserLogDTO();log.setUserId(account.getAccountId());log.setUserName(account.getName());log.setUserIp(ip);log.setOperationUrl(operationUrl);log.setOperationContent(operationContent);log.setParameMap(nameAndArgs);logSysUserService.saveSysUserLog(log);break;}}}}}catch(Exception e) {LoggerUtils.error("记录用户操作日志失败!", e);}}}/*** @Title: getParameMap* @Description: 获取参数的名称和值* @author: 施勇* @date: 2018年10月3日 下午3:12:26* @param: @param joinPoint* @param: @return* @return: Map<String,Object>* @throws*/public Map<String,Object> getParameMap(JoinPoint joinPoint){Map<String, Object> map = new HashMap<String, Object>();Object[] args = joinPoint.getArgs(); // 参数值String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames(); // 参数名for(int i=0;i<argNames.length;i++){if("response".equals(argNames[i]) || "request".equals(argNames[i]) || "pwd".equals(argNames[i])){continue;}else{map.put(argNames[i], args[i]);}}return map;}}

getParameMap()这个方法是用于获取用户请求中的参数,只需要保存业务相关的参数就可以了,所以将request和response过滤掉了,同时也不保存用户登录时的密码。对这个参数Map在保存到数据库中的时候可以转换成JSONString,这样方便查看。

4,使用注解
在需要记录日志的地方加上注解

 @RequestMapping("/doLogin")@ResponseBody@UserLog(operationContent="登录系统")public ResultBean doLogin(String loginName, String pwd, HttpServletRequest request,HttpServletResponse response){}

这里重点是AOP切面保存用户操作日志,其他AOP相关配置就不重复说了。

使用Spring AOP自定义注解方式实现用户操作日志记录相关推荐

  1. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  2. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  3. Spring AOP自定义注解并获取注解的参数

    环境 springboot:1.5 Intellij IDEA:2021.1 序言 最近有个需求,要做方法层面的权限控制.以前在公司使用的是spring security,然后使用注解 如下: @Pr ...

  4. aop注解配置切点 spring_springboot aop 自定义注解方式实现一套完善的日志记录

    一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型(增删改查),详细描述,返回值. 二:项目结构图 如果想学习Java ...

  5. Java之——Spring AOP自定义注解实现日志管理

    转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80295737 1.定义日志类SystemLog package io.mykit ...

  6. Spring AOP 自定义注解记录操作日志

    1.自定义注释 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ...

  7. 自定义注解妙用,一行代码搞定用户操作日志记录,你学会了吗?

    来源:https://blog.csdn.net/yjt520557/article/details/85099115 | 简介 我在使用spring完成项目的时候需要完成记录日志,我开始以为Spri ...

  8. 自定义注解妙用,一行代码搞定用户操作日志记录

    1.简介 在使用spring完成项目的时候需要完成记录日志,开始以为Spring 的AOP功能,就可以轻松解决,半个小时都不用,可是经过一番了解过后,发现一般的日志记录,只能记录一些简单的操作,例如表 ...

  9. java切面类整合_自定义注解+面向切面整合的日志记录模块(一)

    java中的常见注解 jdk的自带注解 @Override:告诉编译器我重写了接口方法 @Deprecated:告诉编译器这个方法过时了,不建议使用,Ide会在方法上划横线 @SuppressWarn ...

最新文章

  1. Git GitLab 使用及规范
  2. javaweb学习总结(三十一)——国际化(i18n)
  3. hash 值重复_MySQL调优实战:MySQL B+Tree索引和Hash索引的区别?
  4. NUTCH的安装与测试
  5. C++项目库包含,dll引用问题,直接把缺失的dll或库放置可执行文件里
  6. 字符串是单一字符的无序组合吗_Python学习笔记(八)组合数据类型
  7. PHP将字符串首字母大小写转换
  8. mysql1846错误_远程连接MySQL报错ERROR 2003解决办法
  9. linux端口零内存拷贝,Linux设备驱动之I/O端口与I/O内存
  10. 一文读懂GaussDB(openGauss) 的六大关键技术特性
  11. C#生成CHM文件(应用篇)
  12. python学生管理系统gui版好例子网_python界面版学生管理系统 相关实例(示例源码)下载 - 好例子网...
  13. android我的世界连接pc,我的世界手机玩电脑版操作教程(可以连接pc版服务器)
  14. 《游戏学习》| html5 飞翔的小鸟 小游戏代码示例
  15. android工程如何创建数据库,安卓项目-利用Sqlite数据库,开发新闻发布系统
  16. CTF中简单杂项小结
  17. HDU 5745 La Vie en rose(简单模拟)
  18. 告别无休止的甩锅,开发和运维如何高效合作
  19. 前端开发者应该知道的 Centos/Dokcer/Nginx/Node/Jenkins 操作( 长文)
  20. 菜鸟Java开发人员的找工作之旅(1)

热门文章

  1. python遍历字符串存入列表_Python遍历字符串的4种方式
  2. 2021阿里云峰会|【全链路数据服务-数据库】分论坛火热报名中
  3. 《我曾》火了:人这辈子,最怕突然听懂这首歌
  4. 用JAVA写的21点游戏(BlackJack)
  5. 各大门户手机端页面是怎么切得
  6. python遍历数组的两种方法
  7. 构建证券行情分析系统——基础篇
  8. 初中计算机怎么打根号,电脑怎么打根号符号(EXCEL符号输入的小技巧)
  9. element-ui 表格 修改后, 表格里面的数据 页面不实时更新问题 完美解
  10. android手机收到消息推送无法显示,部分安卓手机收不到推送消息的解决方法(附图例)...