通过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. Vue2.0如何实现父组件与子组件之间的事件发射与接收

    关于vue2.0的事件发射和接收,大家都知道$dispatch和$broadcast在vue2.0已经被弃用了,取而代之的是更加方便快捷的方式,使用事件中心,组件通过它来互相通信,不管组件在哪一个层都 ...

  2. Codeforces Round #232 (Div. 2) On Sum of Fractions

    Let's assume that v(n) is the largest prime number, that does not exceed n; u(n) is the smallest pri ...

  3. [K/3Cloud]关于K/3 Cloud v2.0升级补丁的疑问

    现在除了K/3 Cloud v2.0的正式版之外,后续又发布了SP1和SP2补丁包.改善了一些问题和BUG,有些人之前可能之前装了SP1,有的可能没装过.在这里我说明一下: 不管装没装过补丁直接打SP ...

  4. codevs4419 FFF 团卧底的菊花

    题目描述 Description FFF 团卧底在这次出题后就知道他的菊花可能有巨大的危险,于是他提前摆布好了菊花阵,现在菊花阵里有若干朵菊花,出现次数最多的那一朵就是出题人的,你的任务是需要找出出题 ...

  5. LeetCode240:Search a 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  6. HDU 5305(Friends-暴搜)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  7. Sping框架的IOC特性

    IOC(Inversion of Control):控制反转 以下以课程与老师的安排来介绍控制反转. 一个合理的课程编排系统应该围绕培训的内容为核心,而不应该以具体的培训老师为核心,这样才能在正常授课 ...

  8. Ubuntu中取消秘钥环

    1.打开应用程序->附件->password和加密密钥(或者在终端中输入 seahorse) 2.切换到password选项卡,会看到一个password密钥环 3.右击->更改pa ...

  9. 【cocos2dx 小技巧】半透明屏蔽罩和弹出框的实现

    今天介绍一下,弹出框的和屏蔽罩的小实现~ 弹出框主要用到了cocos2dx生命周期里面的OnEnter()函数,就是当Layer被addChild的时候会调用的函数(所以假设把OnEnter的代码加到 ...

  10. cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息

    [问题]用c编写cgi程序怎样取出html表单post来的数据? [分析]html表单post来的数据形如username="zhang"&&password=&q ...