通过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. JUnit基本用法

    JUnit的一些注意事项: 测试方法必须使用@Test修饰 测试方法必须使用public void进行修饰,不能带参数 一般使用单元测试会新建一个test目录存放测试代码,在生产部署的时候只需要将te ...

  2. 洛谷——P1103 书本整理

    https://www.luogu.org/problem/show?pid=1103 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所 ...

  3. 一篮子苹果,每天吃一半多一个吃,第十天吃一半多一个后就剩余一个,求一共多少个苹果,JAVA版

    /** * @author xuzhu **/public class TestApple { public static void main(String[] args) { int days = ...

  4. css3 和 html5 笔记

    1.css3 ie下大部分不兼容 ie9以下 浏览器低版本不兼容 需要写 -webket-transition:1s -moz-transition: 1s -o-transition:1s tran ...

  5. org.apache.shiro.web.servlet.ShiroHttpServletRequest cannot be cast to org.springframwork.web.mult..

    在用dwz框架+spring MVC时上传文件报的错 详细错误例如以下: 事实上就是一个类型转换错误,但却研究了好长时间,怎么都不知道哪里错了.由于前面卸过一个文件上传的和这个差点儿相同,那个就没有问 ...

  6. HR系统-人员申请单

    部门在人员缺失时,须要进行人员申请, 申请会涉及到单据的建立及审核.单据建立界面例如以下:

  7. Fedora下克隆Octopress博客

    我在自己的github上搭建了一个Octopress博客(http://songlee24.github.io/),用于不定期的写一些学习笔记和心得体会.但是有时候由于换了电脑或者重装了linux系统 ...

  8. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

    Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...

  9. C#之线程和线程池(Thread和ThreadPool类)

    注:要使用此方法都需要引入应用:using System.Threading;//引入应用 参数意义:将要执行的方法排入队列以便执行,WaitCallback,即表示将要执行的方法:Object,包含 ...

  10. logistic regression教程3

    在线性拟合的基础上,我们实现logistic regression. 如前所述,样本集是 {x1,y1},{x2,y2},...,{xn,yn}[1] 其中,xi=[1,xi,1,xi,2,xi,3, ...