自定义注解实现AOP日志记录

自定义注解

package com.annotation;  

import java.lang.annotation.*;  

/**
 *自定义注解 拦截Controller
 */  

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public  @interface SystemLog {  

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

}
  

AOP切点类

package com.logAop;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import javax.inject.Inject;

import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
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.stereotype.Component;

import com.lanyuan.annotation.SystemLog;
import com.lanyuan.entity.LogFormMap;
import com.lanyuan.mapper.LogMapper;
import com.lanyuan.util.Common;
/**
 * 切点
 * @version 1.0
 */
@Aspect
@Component
public  class LogAopAction {
    //本地异常日志记录对象
     private  static  final Logger logger = LoggerFactory.getLogger(LogAopAction. class);
     @Inject
     private LogMapper logMapper;
     //Controller层切点
    @Pointcut("@annotation(com.annotation.SystemLog)")
     public  void controllerAspect() {
    }

    /**
     * 操作异常记录
     *@descript
     *@param point
     *@version 1.0
     */
    @AfterThrowing(pointcut = "controllerAspect()", throwing = "e")
    public  void doAfterThrowing(JoinPoint point, Throwable e) {
        LogFormMap logForm = new LogFormMap();
         Map<String, Object> map = null;
        String user = null;
        String ip = null;
        try {
            ip = SecurityUtils.getSubject().getSession().getHost();
        } catch (Exception ee) {
            ip = "无法获取登录用户Ip";
        }
        try {
            map=getControllerMethodDescription(point);
            // 登录名
            user = SecurityUtils.getSubject().getPrincipal().toString();
            if (Common.isEmpty(user)) {
                user = "无法获取登录用户信息!";
            }
        } catch (Exception ee) {
            user = "无法获取登录用户信息!";
        }

        logForm.put("accountName",user);
        logForm.put("module",map.get("module"));
        logForm.put("methods","<font color=\"red\">执行方法异常:-->"+map.get("methods")+"</font>");
        logForm.put("description","<font color=\"red\">执行方法异常:-->"+e+"</font>");
        logForm.put("actionTime","0");
        logForm.put("userIP",ip);
        try {
            logMapper.addEntity(logForm);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
    /**
     * 前置通知 用于拦截Controller层记录用户的操作
     *
     * @param joinPoint 切点
     */
    @Around("controllerAspect()")
     public Object doController(ProceedingJoinPoint point) {
        Object result = null;
        // 执行方法名
        String methodName = point.getSignature().getName();
        String className = point.getTarget().getClass().getSimpleName();
        LogFormMap logForm = new LogFormMap();
         Map<String, Object> map = null;
        String user = null;
        Long start = 0L;
        Long end = 0L;
        Long time = 0L;
        String ip = null;
        try {
            ip = SecurityUtils.getSubject().getSession().getHost();
        } catch (Exception e) {
            ip = "无法获取登录用户Ip";
        }
        try {
            // 登录名
            user = SecurityUtils.getSubject().getPrincipal().toString();
            if (Common.isEmpty(user)) {
                user = "无法获取登录用户信息!";
            }
        } catch (Exception e) {
            user = "无法获取登录用户信息!";
        }
        // 当前用户
        try {
            map=getControllerMethodDescription(point);
            // 执行方法所消耗的时间
            start = System.currentTimeMillis();
            result = point.proceed();
            end = System.currentTimeMillis();
            time = end - start;
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
         try {
             logForm.put("accountName",user);
             logForm.put("module",map.get("module"));
             logForm.put("methods",map.get("methods"));
             logForm.put("description",map.get("description"));
             logForm.put("actionTime",time.toString());
             logForm.put("userIP",ip);
             logMapper.addEntity(logForm);
            //*========控制台输出=========*//
            System.out.println("=====通知开始=====");
            System.out.println("请求方法:" + className + "." + methodName + "()");
            System.out.println("方法描述:" + map);
            System.out.println("请求IP:" + ip);
            System.out.println("=====通知结束=====");
        }  catch (Exception e) {
            //记录本地异常日志
            logger.error("====通知异常====");
            logger.error("异常信息:{}", e.getMessage());
        }
         return result;
    }
    /**
     * 获取注解中对方法的描述信息 用于Controller层注解
     *
     * @param joinPoint 切点
     * @return 方法描述
     * @throws Exception
     */
     @SuppressWarnings("rawtypes")
    public Map<String, Object> getControllerMethodDescription(JoinPoint joinPoint)  throws Exception {
         Map<String, Object> map = new HashMap<String, Object>();
         String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();
        Class targetClass = Class.forName(targetName);
        Method[] methods = targetClass.getMethods();
         for (Method method : methods) {
             if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                 if (clazzs.length == arguments.length) {
                     map.put("module", method.getAnnotation(SystemLog.class).module());
                     map.put("methods", method.getAnnotation(SystemLog.class).methods());
                     String de = method.getAnnotation(SystemLog.class).description();
                     if(Common.isEmpty(de))de="执行成功!";
                     map.put("description", de);
                     break;
                }
            }
        }
         return map;
    }
}

需要记录日志的加

@ResponseBody
    @RequestMapping("deleteEntity")
    @Transactional(readOnly=false)//需要事务操作必须加入此注解
    @SystemLog(module="系统管理",methods="组管理-删除组")//凡需要处理业务逻辑的.都需要记录操作日志
    public String deleteEntity() throws Exception {
        String[] ids = getParaValues("ids");
        for (String id : ids) {
            roleMapper.deleteByAttribute("id", id, RoleFormMap.class);
        }
        return "success";
    
时间: 2024-10-15 09:30:06

自定义注解实现AOP日志记录的相关文章

spring AOP自定义注解方式实现日志管理

转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在applicationContext-mvc.xml中要添加的 <mvc:annotation-driven />     <!-- 激活组件扫描功能,在包com.gcx及其子包下面自动扫描通过注解配置的组件 -->     <conte

通过自定义注解与aop统一存储操作记录

模块开发完成后,接到通知需要添加操作记录功能,看着那一堆接口,如果一个方法一个方法的加,那真是太麻烦了.为了偷懒,就百度了一下,发现可以通过自定义注解和aop的形式来统一添加操作记录,只需要在每个方法上面添加自定义的注解就可以了.我在这里用的是springboot2.0以及jpa,废话不多说,直接上代码~ 自定义注解serverLog import java.lang.annotation.ElementType; import java.lang.annotation.Retention; i

SpringBoot利用自定义注解实现AOP

SpringBoot利用自定义注解实现AOP java 本文主要讲解利用SpringBoot的自定义注解来实现AOP思想. 在开始所有的操作之前,需要导入aop坐标: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 如何自定义注解? 实际上注解本

基于 自定义注解 和 aop 实现使用memcache 对数据库的缓存 示例

好久没更新blog了,在新公司打拼了两个月,每天都从早忙到晚,学到了很多东西,但是没有时间来更新blog了.... 下面开始讲解这次的主题 公司老大让我研究 ocs 就是阿里云的 开放缓存服务 点击打开链接 其实就是一个memcache的服务 memchech 就是用内存来存放 key -value  在一些情况下就不必频繁的访问 数据库了(其实就是个map) 如何在常用的Dao中方便的使用这个map呢,我首先想到了 aop,然后又想到了自定义注解,那么就开始干吧.... aop动态代理要使用的

使用自定义注解和AOP管理shiro权限

一.场景 在使用shiro框架的时候,遇到了这样的需求:本系统有多个用户,每个用户分配不同角色,每个角色的权限也不一致.比如A用户拥有新闻列表的增删改查权限,而B用户只有查看新闻列表的权限,而没有删除.新增.修改的权限,此时有3种方案:1.不给B用户分配删除.新增.修改的菜单,这样用户就无法点击从而无法操作.2.给B用户分配菜单,后台中进行增删改查操作时都要进行权限验证.  3.给B用户分配菜单并且进行操作的时候校验权限. 显然,第2.3种方案比第1中方案要安全.本系统中使用第二种方案. 二.为

自定义注解-基于AOP

依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 注解1(不带参数): /** * sea test 使用 AOP 自定义注解(不带参数) * @author sea * */ @Target({ElementType.METHOD}) @

springAop整合自定义注解做方法日志配置(源码在附件)

package com.aop.log.anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)//运行期 @Target({ElementType.M

Asp.net MVC通过自定义特性实现Action日志记录

一.自定义特性 /// <summary> /// 描述特性 /// </summary> [AttributeUsage(AttributeTargets.Method)] public sealed class DescribeAttribute : Attribute { private string _funDescribe; public DescribeAttribute() { } public DescribeAttribute(string funDescribe

参数上使用自定义注解在aop中无法获取到该参数

https://ask.csdn.net/questions/769477 /** * 环绕增强,验证权限 * @param joinPoint 目标对象 * @param authCheck 自定义的注解,Around必须这样写,否则自定义的注解无法传入 * */ @Around("pointAll() && @annotation(authCheck)") public Object before(ProceedingJoinPoint joinPoint, Aut