SpringAop--系统日志简例
通过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--系统日志简例的更多相关文章
- linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- jvm内存增长问题排查简例
jvm内存增长问题排查 排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒. 运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean ...
- List元素排序简例
前言:这种处理方式,在程序中偶尔会用的到,栗子很简单,关键是加强一下记忆,以及以备后用 1:实现Comparable接口的方式 1-1:没有使用泛型,重写compareTo()方法时需要判断类型及转换 ...
- urllib 和urllib2 模块使用简例
一.最简单的使用 import urllib,urllib2 response = urllib2.urlopen("https://www.baidu.com") print r ...
- OpenCV几种边缘检测的简例
简单记录一下OpenCV的几种边缘检测函数的用法. 边缘检测算法 以Sobel边缘检测算法为例. Sobel卷积核模板为: 偏导公式为: Gx(i,j)=[f(i+1,j−1)+2f(i+1,j)+f ...
- SQLServer 用法简例
子曰:“温故而知新,可以为师矣.”孔子说:“温习旧知识从而得知新的理解与体会,凭借这一点就可以成为老师了.“ 尤其是咱们搞程序的人,不管是不是全栈工程师,都是集十八般武艺于一身.不过有时候有些知识 ...
- 简例 一次执行多条mysql insert语句
package com.demo.kafka;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Prep ...
- 【VLC-Android】vlc-android简例
前言 继续折腾vlc,做这个例子并不顺利,卡在只有声音没有图像这个问题好久,网上的例子有些API已经对不上,继续分享,,, 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cn ...
随机推荐
- 威纶通 与 信捷XC\XD系列PLC 通讯
第一次使用信捷XD系列PLC正式做个项目,用的触摸屏为威纶通的 MT6071iP (注意:下面内容同样适用于 信捷XC系列PLC ,除信捷XC与XD系列编程软件不一样,其余接线设置实测均一样 ) 目前 ...
- 什么是Spring Boot简介
1.什么是spring boot 简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置. 从本质上来说,Spring Boot就是Spring,它 ...
- Speak a Good Word for SB
今天举行了英语词汇发音交流会,通过这个会议我有了非常大了感触. 一共同拥有三个环节.第一个环节读单词我们组读的单词it.pen.do.stop.think.park.sink.wood.在这一个环节中 ...
- Photoshop 手动画金标准流程
以下给出Photoshop手动画金标准的流程, 1. 读取 图片 2. 找到套锁button 3. 利用套锁button手动画金标准 4. 点击套锁区域.右键新建图层 此时能够看到右側出现新建的图层1 ...
- Project Euler:Problem 42 Coded triangle numbers
The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangl ...
- Unity3d中相应各平台Path
IOS: Application.dataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xx ...
- hdoj-1214-圆桌会议【逆序数】
圆桌会议 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- 浅析Java开发模式—Model1、Model2和三层
"解耦"的思想一直是我们倡导的,但在实际项目中怎样去做?这是需要我们去好好思考的.下面以Model1.Model2.三层为切入点,对比下去了解解耦的思想. Model1 使用JSP ...
- SoapUI项目书写自我规范
-->Assertions 判断某个节点存在(_input_name, _button_name) -->Resource 文件夹命名 值去掉红色部分信息 https://mercury- ...
- changing permissions of Read-only file system in linux
up vote 2 down vote favorite 1 i use this command to make a bootable flash disk of linux mint sudo ...