通过Spring的Aop我们可以声明式的配置事务管理,那么同样可以通过SpringAop来进行处理的系统日志该如何实现呢?

一、数据表和实体类的准备

  我们要管理系统日志,那么数据表和实体类是必不可少的,这里编写一个简单的实体类:

/**
* 系统日志实体类
*
* @author Mr.song
* @date 2019/05/09 17:57
*/
public class SysLog implements Serializable { private String id;
private String userName;
private String ip;
private Date time;
private String method;//访问的方法名称
private String action;//进行的操作名称
//...
}

同时我们还要完成Dao层和Service层相应的添加、查询方法。(比较简单,这里忽略)

二.编写日志通知的切面类

这里采用基于注解的环绕通知

/**
* 用于记录日志的通知
*
* @author Mr.song
* @date 2019/05/09 19:50
*/
@Aspect //声明为切面类
@Component
public class LogAspect { @Autowired
private SysLogService sysLogService;
@Autowired
private HttpSession session;
@Autowired
private HttpServletRequest request; @Around("execution(* cn.dintalk.web.controller.*.*.*(..))")
public Object aroundSysLog(ProceedingJoinPoint pjp) {
try {
//获取到切入点的签名
Signature signature = pjp.getSignature();
//将签名转为方法的签名
if (signature instanceof MethodSignature) {
MethodSignature ms = (MethodSignature) signature;
//获取方法
Method method = ms.getMethod();
//获取注解(判断是否为RequestMapping类型的)
if (method.isAnnotationPresent(RequestMapping.class)) {
//创建日志对象
SysLog sysLog = new SysLog();
//设置日志的操作方法和名称
sysLog.setMethod(method.getName());
//获取方法上的注解,设置日志的操作名称
RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
sysLog.setAction(requestMapping.name());
//设置日志的用户相关信息
User user = (User) session.getAttribute("user");
if (user == null || UtilFuns.isEmpty(user.getUserName())) {
//匿名访问
sysLog.setUserName("匿名");
} else {
sysLog.setUserName(user.getUserName());
}
//设置日志的ip和时间
sysLog.setTime(new Date());
sysLog.setIp(request.getRemoteAddr());
//添加日志
sysLogService.add(sysLog);
}
}
//获取当前切入点方法的所需参数
Object[] args = pjp.getArgs();
//执行方法并返回
Object obj = pjp.proceed(args);
return obj;
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}

Tips: 要注意在配置文件中开启对注解切面的支持

<!-- 开启切面注解支持 -->
<aop:aspectj-autoproxy/>

Tips : 由于日志需要具体的操作名称,因此我们的Controller中的方法上的注解就需要为该操作起名称。如(name="查看用户列表"):

//展示用户列表
@RequestMapping(value = "/list",name = "查看用户列表")
public String list(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5") int size){
//1.查询到企业下用户的分页数据
PageInfo pageInfo = userService.findAll(companyId, page, size);
//2.保存到域中进行转发
request.setAttribute("page",pageInfo);
return "system/user/user-list";
}

关注微信公众号,随时随地学习

SpringAop--系统日志简例的更多相关文章

  1. linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...

  2. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  3. jvm内存增长问题排查简例

    jvm内存增长问题排查 排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒. 运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean ...

  4. List元素排序简例

    前言:这种处理方式,在程序中偶尔会用的到,栗子很简单,关键是加强一下记忆,以及以备后用 1:实现Comparable接口的方式 1-1:没有使用泛型,重写compareTo()方法时需要判断类型及转换 ...

  5. urllib 和urllib2 模块使用简例

    一.最简单的使用 import urllib,urllib2 response = urllib2.urlopen("https://www.baidu.com") print r ...

  6. OpenCV几种边缘检测的简例

    简单记录一下OpenCV的几种边缘检测函数的用法. 边缘检测算法 以Sobel边缘检测算法为例. Sobel卷积核模板为: 偏导公式为: Gx(i,j)=[f(i+1,j−1)+2f(i+1,j)+f ...

  7. SQLServer 用法简例

      子曰:“温故而知新,可以为师矣.”孔子说:“温习旧知识从而得知新的理解与体会,凭借这一点就可以成为老师了.“ 尤其是咱们搞程序的人,不管是不是全栈工程师,都是集十八般武艺于一身.不过有时候有些知识 ...

  8. 简例 一次执行多条mysql insert语句

    package com.demo.kafka;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Prep ...

  9. 【VLC-Android】vlc-android简例

    前言 继续折腾vlc,做这个例子并不顺利,卡在只有声音没有图像这个问题好久,网上的例子有些API已经对不上,继续分享,,, 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cn ...

随机推荐

  1. 百练2815:城堡问题(DFS)

    描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # ...

  2. iframe 与frameset

    frameset 元素可定义一个框架集.它被用来组织多个窗口(框架).每个框架存有独立的文档.在其最简单的应用中,frameset 元素仅仅会规定在框架集中存在多少列或多少行.您必须使用 cols 或 ...

  3. Ubuntu16.04再次装机记

    个人的吐槽 整个国庆假期(9天),基本上都在搭建PHP环境中耗费了. 是这样的——来大学报到前,想着大学里用个Dev-C++应该够了,于是把Ubuntu删了,腾出了100G的空间.到了CSU,加了团委 ...

  4. noip模拟赛 铺瓷砖

    [问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖, 你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度为A/B贴在第二行的每块瓷 ...

  5. MYSQL中有关数据库的简单操作

    #创建数据库CREATE DATABASE day01; #查询所有数据库SHOW DATABASES; #查看某个数据库定义信息SHOW CREATE DATABASE day01; #查询正在使用 ...

  6. 【sql技巧】mysql修改时,动态指定要修改的字段 update `table` set (case when ....) = 1 where id = xx

    如果你点进了这篇帖子,那么你一定遇到了跟我一样的问题.别看题目的set case when...,我一开始也是第一反应是用case when但是发现并不好使. 问题呢,说得高大上一点:动态指定要修改的 ...

  7. Docker: Docker容器之间互相通信

    最简单的方法,关闭防火墙(只建议用于开发环境) systemctl stop firewalld

  8. IIS: 配置web.config解决Maximum request length exceeded错误

    In system.web <httpRuntime maxRequestLength="1048576" executionTimeout="3600" ...

  9. Windows 注册表常用操作

    1 添加一个主键(比如在HKEY_LOCAL_MACHINE\SOFTWARE\中添加一个ABCEDFGHIJKLMN主键) Windows Registry Editor Version 5.00 ...

  10. Oracle 简单的列转行

    需求是,统计每一个部门不同工种的薪水总和. SQL> select deptno,ename,job,sal from emp;     DEPTNO ENAME      JOB       ...