ssm 项目记录用户操作日志和异常日志
借助网上参考的内容,写出自己记录操作日志的心得!!
我用的是ssm项目使用aop记录日志;这里用到了aop的切点 和 自定义注解方式;
1、建好数据表:
数据库记录的字段有: 日志id 、操作人、操作人IP、操作时间、操作方法、操作哪个控制层或者服务层、操作说明(记录用户操作的详情说明)、类型、异常信息
2、在spring重配置如下:
因为在spring里我配置了记录服务层的切点; 所以我在spring-mvc 里面 重新配置了一个可以扫描控制层的切点,使用的是cglib 代理:
<!-- 启动AOP AspectJ注解自动代理 -->
<aop:aspectj-autoproxy />
<!-- 通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller -->
<aop:config proxy-target-class="true"></aop:config>
3、接下来写自定义的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface ArchivesLog { /**
* 操作说明
*/
public String operteContent() default ""; }
4、拿到切点的内容,并且在此存库
package com.zhkj.jtpdms.log; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import com.zhkj.jtpdms.entity.system.LogInfo;
import com.zhkj.jtpdms.entity.system.User;
import com.zhkj.jtpdms.service.system.LogInfoService;
import com.zhkj.jtpdms.util.GlobalConstant; /**
* 操作日志类
*
* @author MEIM
*
*/ @Aspect
@Component
public class ArchivesLogAspect {
@Autowired
private LogInfoService loginfoService; private static final Logger logger = LoggerFactory.getLogger(ArchivesLog.class); @Pointcut("@annotation(ArchivesLog)")
public void controllerAspect() {
//System.out.println("切入点...");
} /**
* 方法调用后触发 , 记录正常操作
*
* @param joinPoint
* @throws ClassNotFoundException
*/
@AfterReturning("controllerAspect()")
public void after(JoinPoint joinPoint) throws ClassNotFoundException {
// 用户id
int userId = getUSerMsg().getId();
// 用户IP
String ip = getUSerMsg().getLoginIp();
// 控制器名
String targetName = getMethodDesc(joinPoint).getController();
// 方法名
String methodName = getMethodDesc(joinPoint).getMethod();
// 操作说明
String operteContent = getMethodDesc(joinPoint).getOperateContent();
LogInfo logInfo = new LogInfo();
logInfo.setUserId(userId);
logInfo.setIp(ip);
logInfo.setOperateContent(operteContent);
logInfo.setMethod(methodName);
logInfo.setController(targetName);
loginfoService.insertLog(logInfo);
} /**
* 发生异常,走此方法
* @param joinPoint
* @param e
*/
@AfterThrowing(pointcut = "controllerAspect()", throwing = "e")
public void AfterThrowing(JoinPoint joinPoint, Throwable e) {
try {
// 用户id
int userId = getUSerMsg().getId();
// 用户IP
String ip = getUSerMsg().getLoginIp();
// 控制器名
String targetName = getMethodDesc(joinPoint).getController();
// 方法名
String methodName = getMethodDesc(joinPoint).getMethod();
// 操作说明
String operteContent = getMethodDesc(joinPoint).getOperateContent();
LogInfo logInfo = new LogInfo();
String exMsg = e.getCause().toString();
if (exMsg != null) {
int type = 2;
logInfo.setUserId(userId);
logInfo.setIp(ip);
logInfo.setOperateContent(operteContent);
logInfo.setMethod(methodName);
logInfo.setController(targetName);
logInfo.setType(type);
logInfo.setExMsg(exMsg);
loginfoService.insertLog(logInfo);
}
} catch (Exception e1) {
logger.error(e1.getMessage());
}
} /**
* 获取 注解中对方法的描述
*
* @return
* @throws ClassNotFoundException
*/
public static LogInfo getMethodDesc(JoinPoint joinPoint) throws ClassNotFoundException {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
String operteContent = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
// 操作说明
operteContent = method.getAnnotation(ArchivesLog.class).operteContent();
break;
}
}
}
LogInfo logInfo = new LogInfo();
logInfo.setController(targetName);
logInfo.setMethod(methodName);
logInfo.setOperateContent(operteContent);
return logInfo;
} /**
* 得到用户信息
*
* @return
*/
public static User getUSerMsg() {
HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 获取session
HttpSession session = req.getSession();
User user = (User) session.getAttribute(GlobalConstant.SESSION_USER);
return user;
} }
5、在控制层/服务层加上自定义注解即可成功
@RequestMapping("/saveUser")
@ResponseBody
// 此处加上自定义注解 ,operteContent 是操作说明
@ArchivesLog(operteContent = "新增用户")
public JsonResult saveUser(User user, String check) {
//... 增加操作
}
6、查看效果如下:

7、注意事项:
需要在spring-mvc 配置aop !!!
通知的几个属性(@around , @before ,@after ,@afterRetruning,@afterThrowing)需要弄清楚!!
还有不明白之处欢迎沟通!
ssm 项目记录用户操作日志和异常日志的更多相关文章
- RabbitMQ实战场景(一):异步记录用户操作日志
传统的项目开发中业务流程以串行方式,执行了模块1—>模块2–>模块3 而我们知道,这个执行流程其实对于整个程序来讲是有一定的弊端的,主要有几点: (1)整个流程的执行响应等待时间比较长; ...
- 使用SpringBoot AOP 记录操作日志、异常日志
平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...
- Spring AOP使用注解记录用户操作日志
最后一个方法:核心的日志记录方法 package com.migu.cm.aspect; import com.alibaba.fastjson.JSON; import com.migu.cm.do ...
- springAOP记录用户操作日志
项目已经开发完成,需要加用户操作日志,如果返回去加也不太现实,所以使用springAOP来完成比较合适. 注解工具类: @Retention(RetentionPolicy.RUNTIME) @Tar ...
- 使用 script 命令记录用户操作行为
Script 命令可以帮助管理员记录用户的操作行为,包括用户查看文件中的哪些具体内容,写入了哪些文件,写了些什么都能看到,比较详细的记录了用户的操作行为. 本文对此进行简要说明. 1.添加日志记录 e ...
- linux系统监控:记录用户操作轨迹,谁动过服务器
1.前言 我们在实际工作当中,都碰到过误操作.误删除.误修改过配置文件等等事件.对于没有堡垒机的公司来说,要在linux系统上深究到底谁做过配置文件的修改.做过误删除是很头疼的事情,特别是遇到删库跑路 ...
- 记录用户操作历史命令history
我们知道可以使用history命令,查看自己的操作记录,但如果你是root用户,如何查看其它用户的操作记录呢? 其实history命令只是把当前用户目录下的~/.bash_History文件内容列 ...
- 一次SSM项目记录
1.控制台输入 mvn archetype:generate -DgroupId=com.yjdev -DartifactId=myzone -DarchetypeArtifactId=maven-a ...
- linux 记录用户操作日志
将以下加入到/etc/profile 最后 history USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]/ ...
随机推荐
- Appscan漏洞之跨站点请求伪造(CSRF)
公司前段时间使用了Fortify扫描项目代码,在修复完这些Fortify漏洞后,最近又启用了Appscan对项目代码进行漏洞扫描,同样也是安排了本人对这些漏洞进行修复.现在,针对修复过的Appscan ...
- UCOSIII时间片轮转调度
OS_RATE_HZ const OSCfg_TickRate_Hz = (OS_RATE_HZ )OS_CFG_TICK_RATE_HZ; #define OS_CFG_TICK_RATE_HZ 2 ...
- wireshark分析https数据包解密前后的特点
wireshark分析https数据包解密前后的特点 (一)https解密前 1.协议种类:2种(1)TCP(第四层,传输层)(2)SSL/TLS(第五层,应用层,加解密)2.应用层数据所在数据包特点 ...
- 用python执行 js代码__来自脚本之家
"" github地址 :https://github.com/emmetio/pyv8-binaries "" 安装依赖 首先安装依赖:Boost, 这一步网 ...
- p5.BTC-网络
Bitcoin工作在应用层,网络层是P2P . Bitcoin网络通信的设计原则是 simple robust ,but not efficient. 每个节点维护一个邻居节点的集合,消息传播采取 ...
- Docker -compose install Harbor
Docker-compose Harbor install Docker install Yum install docker-compose 首先安装 yum configuation 管理工具 [ ...
- Linux下环境变量设置 (转)
Linux下环境变量设置 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错 ...
- python面试总结3(性能分析优化,GIl常考题)
python性能分析和优化,GIL常考题 什么是Cpython GIL Cpython解释器的内存管理并不是线程安全的 保护多线程情况下对python对象访问 Cpython使用简单的锁机制避免多个线 ...
- 基于yum的方式安装Cloudera Manager Server(使用Mysql 8.0版本)
基于yum的方式安装Cloudera Manager Server(使用Mysql 8.0版本) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装和配置元数据库 1>. ...
- /bin/false和/sbin/nologin的区别
/bin/false是最严格的禁止login选项,一切服务都不能用./sbin/nologin只是不允许login系统 其中树莓派的/sbin/nologin文件在/usr/sbin/nologin小 ...