把每次操作记录到数据库

用的注解aop,可以配置XML随你

首先开启注解

<!-- aspectj aop启用CGliB代理 -->
    <aop:aspectj-autoproxy expose-proxy="true" proxy-target-class="true"/>

在写切点方法 

@Aspect
@Component
public  class SystemLogAspect {
    //注入Service用于把日志保存数据库
    @Resource
    private LogService logService;
    //本地异常日志记录对象
    private  static  final Logger logger = LoggerFactory.getLogger(SystemLogAspect. class);

    //Controller层 切点
    @Pointcut("@annotation(workshop.Common.aop.SysLog)")
    public  void controllerAspect() { }

    /**
     * 前置通知 用于拦截Controller层记录用户的操作
     *
     * @param joinPoint 切点
     */
//    ProceedingJoinPoint
    @Before("controllerAspect()")
     public  void doBefore(JoinPoint joinPoint) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//        HttpSession session = request.getSession();
        // 请求用户名 (读取shiro中保存的用户信息)
        ShiroUser user = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
        // 请求类
        String strClassName = joinPoint.getTarget().getClass().getName();
        // 请求地址
        String requestURI=request.getRequestURI();
        // 请求参数
        StringBuffer bfParams = new StringBuffer();
        Object[] params = joinPoint.getArgs();
        Enumeration<String> paraNames = null;
        if (params != null && params.length > 0) {
            paraNames = request.getParameterNames();
            String key;
            String value;
            while (paraNames.hasMoreElements()) {
                key = paraNames.nextElement();
                value = request.getParameter(key);
                bfParams.append(key).append("=").append(value).append("&");
            }
            if (StringUtils.isBlank(bfParams)) {
                bfParams.append(request.getQueryString());
            }
        }
        // 请求的IP
        String ip= WebUtils.getRemoteAddr(request);
         try {
            // System.out.println("=====前置通知开始=====");
            // 获取操作名称
            String operation=getControllerMethodDescription(joinPoint);
            // 获取登录用户名
            String loginName=user.name;

            Log log=new Log();
            log.setLoginName(loginName);
            log.setOperationName(operation);
            log.setOperationClass(strClassName);
            log.setOperationAddress(requestURI);
            log.setParams(bfParams.toString());
            log.setIp(ip);
            log.setCreateTime(MyUtil.getNowDateStr2());
			//*========保存数据库日志=========*//
            //System.out.println(log);
            // 保存数据库
             System.out.println("执行保存操作前");
             logService.insertLog(log);
             System.out.println("执行保存操作后");
        }  catch (Exception e) {
            //记录本地异常日志
            logger.error("==前置通知异常==");
            logger.error("异常信息:{}", e.getMessage());
        }
    }

    /**
     * 获取注解中对方法的描述信息 用于Controller层注解
     *
     * @param joinPoint 切点
     * @return 方法描述
     * @throws Exception
     */
     public  static String getControllerMethodDescription(JoinPoint joinPoint)  throws Exception {
        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 description = "";
         for (Method method : methods) {
             if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                 if (clazzs.length == arguments.length) {
                    description = method.getAnnotation(SysLog.class).value();
                    break;
                }
            }
        }
         return description;
    }
}

再写自定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
	String value() default "";
}

放到控制器上即可

@SysLog(value = "资源信息查看")
    @RequiresPermissions("resource:list")
    @RequestMapping(value = "/manager", method = RequestMethod.GET)
    public String manager() {
        return "resource/resource";
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值