aop实现拦截保存操作日志
生活随笔
收集整理的這篇文章主要介紹了
aop实现拦截保存操作日志
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
公司老大寫的aop 攔截后臺操作日志
1.自定義注解
2.相關枚舉
public enum SysMenu {SYS_USER("用戶管理", "sys_user",SysModule.SYS);/*** 描述*/private final String name;/*** 分類*/private final String type;private final SysModule module;public String getName() {return name;}SysMenu(String name, String type,SysModule module) {this.name = name;this.type = type;this.module =module;}public String getType() {return type;}public SysModule getModule() {return module;} } public enum SysMethod {SAVE("添加", "save"),DEL("刪除", "del"),UPDATE("更新", "update");/*** 描述*/private final String name;/*** 分類*/private final String type;public String getName() {return name;}SysMethod(String name, String type) {this.name = name;this.type = type;}public String getType() {return type;} }3.自定義AOP保存日志
import com.redpacket.common.annotation.SysLog; import com.redpacket.contract.sys.SysMenu; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.*;@Order(2) @Aspect @Component public class SysLogAop {private static final String MODULE="module";private static final String MENU="menu";private static final String METHODS="methods";private static final String DESCRIPTION="description";private static final String ARGS="args";private Logger logger = LoggerFactory.getLogger(this.getClass());//獲取方法參數(shù)private LocalVariableTableParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();@Pointcut("@annotation(com.redpacket.common.annotation.SysLog)")public void LogAspect() {}@Around("LogAspect()")public Object doAround(ProceedingJoinPoint point) {RequestAttributes ra = RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra = (ServletRequestAttributes) ra;HttpServletRequest request = sra.getRequest();Object result = null;try {result = point.proceed();//具體保存logMap<String, Object> map = this.getMethodDescription(point);//模塊名String module = map.get(MODULE).toString();//方法名String methods = map.get(METHODS).toString();//描述String description = map.get(DESCRIPTION).toString();//方法參數(shù)String args = map.get(ARGS).toString();} catch (Throwable e) {logger.error("異常信息:{}", e.getMessage());throw new RuntimeException(e);}return result;}@SuppressWarnings("rawtypes")public Map<String, Object> getMethodDescription(JoinPoint joinPoint) throws Exception {Map<String, Object> map = new HashMap<>();//注解所在類名 com.aglaia.core.manager.acl.impl.AdminUserManagerImplString targetName = joinPoint.getTarget().getClass().getName();//注解method saveString methodName = joinPoint.getSignature().getName();//方法參數(shù)Object[] arguments = joinPoint.getArgs();Class<?> targetClass = Class.forName(targetName);//該類下所有方法Method[] methods = targetClass.getMethods();//找到save方法for (Method method : methods) {if (method.getName().equals(methodName)) {Class[] clazzs = method.getParameterTypes();if (clazzs.length == arguments.length) {SysMenu sysMenu = method.getAnnotation(SysLog.class).menu();map.put(MODULE, sysMenu.getModule().getType());map.put(MENU, sysMenu.getType());map.put(METHODS, method.getAnnotation(SysLog.class).methods().getType());map.put(ARGS, this.getArgs(method, arguments));String desc = method.getAnnotation(SysLog.class).description();if (StringUtils.isEmpty(desc)) {desc = "執(zhí)行成功!";}map.put("description", desc);break;}}}return map;}private String getArgs(Method method, Object[] arguments) {StringBuilder builder = new StringBuilder("{");String params[] = parameterNameDiscoverer.getParameterNames(method);for (int i = 0; i < params.length; i++) {if (!StringUtils.equals("password", params[i])) {if (arguments[i].getClass().isArray()) {arguments[i] = Arrays.toString(makeArrayObject(arguments[i]).toArray());}builder.append(params[i]).append(":").append(arguments[i].toString());if (i != params.length - 1) {builder.append("; ");}}}return builder.append("}").toString();}private List<Object> makeArrayObject(Object array) {List<Object> tem = new ArrayList<Object>();for (int i = 0; i < Array.getLength(array); i++) {tem.add(Array.get(array, i));}return tem;} }4.注解加入處
@Override@Transactional@SysLog(menu = SysMenu.SYS_USER,methods = SysMethod.SAVE)public AdminUser save(AdminUser model) {return super.save(model);}5.重寫實體類中toString方法
@Overridepublic String toString() {return toStringHelper().add("username", username).add("phone", phone).add("email", email).add("nickname", nickname).toString();}總結(jié)
以上是生活随笔為你收集整理的aop实现拦截保存操作日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redhat linux下安装jq和jq
- 下一篇: 各串口设备节点/dev/tty* 的区别