博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringAop--系统日志简例
阅读量:4560 次
发布时间:2019-06-08

本文共 3024 字,大约阅读时间需要 10 分钟。

  通过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      //声明为切面类@Componentpublic 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: 要注意在配置文件中开启对注解切面的支持

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";}

 

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

转载于:https://www.cnblogs.com/dintalk/p/10852562.html

你可能感兴趣的文章
11.3NOIP模拟赛
查看>>
1.SDL介绍
查看>>
【重要更新】语言转换类编程工具Tangible系列本月又更新了!
查看>>
现场赛:开关灯问题
查看>>
codeforces A. Jeff and Rounding (数学公式+贪心)
查看>>
zoj 3462
查看>>
java多线程-信号量
查看>>
如何在Delphi XE2中使用Dynamic Web TWAIN
查看>>
js自定义实用函数总结
查看>>
java内存区域与内存溢出异常
查看>>
点点滴滴的成长[2011-11-1]:理解C#修饰符
查看>>
csrf(跨站请求伪造)
查看>>
高性能MySQL笔记-第1章MySQL Architecture and History-001
查看>>
c# 基本知识 ref 和 out
查看>>
在ubuntu下如何验证文件的MD5码 (转载)
查看>>
嵌入式Linux开发板
查看>>
通过创建制定版本react-native项目解决“Unable to resolve module `AccessibilityInfo` ”的问题...
查看>>
C# 一个例子,北大青鸟的。自己变了下。
查看>>
Error: invalid "instanceof" keyword value Promise的解决方法
查看>>
一,模块,模块导入
查看>>