SSH 下做一个spring AOP的 操作日志记录功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH 下做一个spring AOP的 操作日志记录功能相关的知识,希望对你有一定的参考价值。

参考技术A 给你提供一个思路:
1、写个静态类,定义静态变量,把所有要用到的service(假设AOP拦截到service层)实现类都写成key,value的形式,如:
Map modeMap=new HashMap();
map.put("UserServiceImpl","用户管理")//用于记录类与模块的对应关系。
2、写静态变量,把定义的方法与日志中记录的描述对应。
methodMap.put("add_UserInfo",'添加用户信息');
methodMap.put("update_UserInfo",'修改用户信息');
3、写AOP切入点:
@Resource(name = "baseDao")
private BaseDao baseDao;
@Pointcut("execution (* com.web.*.*.service.*.*(..))")
// 切入点作用域
private void anyMethod()
// 声明一个切入点应用方法
@SuppressWarnings("unchecked")
@AfterReturning(pointcut = "anyMethod()", returning = "result")
public void doAfterReturning(JoinPoint join, Object result)
String classname = join.getTarget().getClass().getName();//获取当前的类名
String method = join.getSignature().getName();//方法名
//再在上述静态MAP里找模块名字和方法描述,略..
//下述session中获取当前用户信息,略..
HttpSession session = HttpRequester.getHttpSession();
//组装日志对象,调用baseDao的方法写日志,略.
本回答被提问者和网友采纳
参考技术B 你这是什么意思.........,AOP是面向切面编程啊,什么叫springAOP的操作日志记录功能啊........

spring-boot aop 增删改操作日志 实现

1.注解接口:
import com.github.wxiaoqi.security.common.constant.Constants;

import java.lang.annotation.*;

/**
* 日志注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLogOpt
String value();

String module() default ""; //模块名称 系统管理-用户管理-列表页面

String description() default ""; //描述

Constants.LogOptEnum operationType() default Constants.LogOptEnum.UNKNOW;//操作类型

 

2.切面类
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.duiyue.common.mvc.core.APIResponse;
import com.duiyue.common.util.LogUtils;
import com.github.wxiaoqi.security.admin.annotation.SysLogOpt;
import com.github.wxiaoqi.security.admin.biz.SysLogService;
import com.github.wxiaoqi.security.api.entity.SysLog;
import com.github.wxiaoqi.security.common.constant.Constants;
import com.github.wxiaoqi.security.common.context.BaseContextHandler;
import com.github.wxiaoqi.security.common.util.RegexUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Slf4j
@Aspect
@Component
public class LogAspect
/**
* 开始时间
*/
private long startTime = 0L;

@Resource
private SysLogService logService;

@Pointcut("execution(* *..rest..*.*(..)) && @annotation(com.github.wxiaoqi.security.admin.annotation.SysLogOpt)")
public void logPointCut()

@Around("logPointCut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable
startTime = System.currentTimeMillis();
Object result = null;
SysLog sysLogModel = logPre(pjp);
try
result = pjp.proceed();
finally
//查询类型不添加日志
if (Constants.LogOptEnum.QUERY.value() != sysLogModel.getOperationType())
if (logAfter(result, sysLogModel).getUserName() != null)
sysLogModel.setCreateTime(new Date());
sysLogModel.setUpdateTime(new Date());
logService.add(sysLogModel);



return result;


private SysLog logPre(ProceedingJoinPoint pjp) throws Exception
SysLog sysLogModel = new SysLog();
for (Method method : Class.forName(pjp.getTarget().getClass().getName()).getMethods())
if (method.getName().equals(pjp.getSignature().getName()))
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == pjp.getArgs().length)
//方法名称
sysLogModel.setOperation(method.getAnnotation(SysLogOpt.class).value());
//操作类型
sysLogModel.setOperationType(method.getAnnotation(SysLogOpt.class).operationType().value());
break;



//获取请求对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
startTime = System.currentTimeMillis();
String ip = HttpUtil.getClientIP(request);
//方法名含包名(om.github.wxiaoqi.security.admin.rest.SysLogController.queryListPage)
String classMethod = pjp.getSignature().getDeclaringTypeName() + "." + pjp.getSignature().getName();
//请求参数
String args = JSON.toJSONString(pjp.getArgs()).replaceAll(RegexUtil.getJSonValueRegex("password"), "****").replaceAll(RegexUtil.getJSonValueRegex("oldPassword"), "****");

sysLogModel.setIp(ip);
sysLogModel.setMethod(classMethod);
sysLogModel.setParams(args);
sysLogModel.setCreateTime(new Date());
sysLogModel.setCreateUser(0L);
sysLogModel.setUpdateUser(0L);

String currentUserName = "";
try
currentUserName = BaseContextHandler.getUsername();
catch (Exception e)
LogUtils.error(log, "", e);

if (StringUtils.isNotEmpty(currentUserName))
sysLogModel.setUserName(currentUserName);

return sysLogModel;


private SysLog logAfter(Object result, SysLog sysLogModel)
APIResponse response = null;
if (result != null)
response = (APIResponse) result;

String currentUserName = "";
try
currentUserName = BaseContextHandler.getUsername();
catch (Exception e)
LogUtils.error(log, "", e);

if (StringUtils.isNotEmpty(currentUserName))
sysLogModel.setUserName(currentUserName);

//返回结果
if (response != null && response.getStatus() == Constants.ResultCodeEnum.SUCCESS.value())
sysLogModel.setResult(1);
else
sysLogModel.setResult(0);

//执行时长(毫秒)
Long spendTime = System.currentTimeMillis() - startTime;
sysLogModel.setProcessTime(spendTime);
return sysLogModel;

 

3.控制层使用(方法上使用)。
@SysLogOpt(module = "活动管理", value = "添加活动", operationType = Constants.LogOptEnum.ADD)

(注:枚举类型未给出,自行修改)

以上是关于SSH 下做一个spring AOP的 操作日志记录功能的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot AOP记录用户操作日志

Spring Boot AOP 简易操作日志管理

spring aop + log4j如何实现详细的后台操作日志,并输出的数据库

springboot使用spring的aop功能实现操作日志功能

springboot—spring aop 实现系统操作日志记录存储到数据库

Spring Boot:AOP&日志操作&异常处理