美文网首页
JAVA自定义注解和AOP配合使用

JAVA自定义注解和AOP配合使用

作者: 不知名的蛋挞 | 来源:发表于2019-09-29 09:28 被阅读0次

    转自:https://www.jianshu.com/p/309cc4fa348e

    需求

    系统中的部分业务方法在被调用到时,需要向log表插入日志,业务方法名没有规律。

    代码

    注解代码
    package com.esurer.common.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    /**
     * 系统日志注解
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SysLog {
    
        String value() default "";
    }
    
    切面代码
    package com.esurer.common.aspect;
    
    import com.google.gson.Gson;
    import com.esurer.common.annotation.SysLog;
    import com.esurer.common.utils.HttpContextUtils;
    import com.esurer.common.utils.IPUtils;
    import com.esurer.modules.sys.entity.SysLogEntity;
    import com.esurer.modules.sys.entity.SysUserEntity;
    import com.esurer.modules.sys.service.SysLogService;
    import org.apache.shiro.SecurityUtils;
    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.aspectj.lang.reflect.MethodSignature;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import javax.servlet.http.HttpServletRequest;
    import java.lang.reflect.Method;
    import java.util.Date;
    /**
     * 系统日志,切面处理类
     */
    @Aspect
    @Component
    public class SysLogAspect {
        @Autowired
        private SysLogService sysLogService;
        
        @Pointcut("@annotation(com.esurer.common.annotation.SysLog)")
        public void logPointCut() { 
            
        }
    
        @Around("logPointCut()")
        public Object around(ProceedingJoinPoint point) throws Throwable {
            long beginTime = System.currentTimeMillis();
            //执行方法
            Object result = point.proceed();
            //执行时长(毫秒)
            long time = System.currentTimeMillis() - beginTime;
    
            //保存日志
            saveSysLog(point, time);
    
            return result;
        }
    
        private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
    
            SysLogEntity sysLog = new SysLogEntity();
            SysLog syslog = method.getAnnotation(SysLog.class);
            if(syslog != null){
                //注解上的描述
                sysLog.setOperation(syslog.value());
            }
    
            //请求的方法名
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = signature.getName();
            sysLog.setMethod(className + "." + methodName + "()");
    
            //请求的参数
            Object[] args = joinPoint.getArgs();
            try{
                String params = new Gson().toJson(args[0]);
                sysLog.setParams(params);
            }catch (Exception e){
    
            }
    
            //获取request
            HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
            //设置IP地址
            sysLog.setIp(IPUtils.getIpAddr(request));
    
            //用户名
            String username = ((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUsername();
            sysLog.setUsername(username);
    
            sysLog.setTime(time);
            sysLog.setCreateDate(new Date());
            //保存系统日志
            sysLogService.save(sysLog);
        }
    }
    
    使用切面的代码
    @SysLog("修改密码")
    @RequestMapping("/password")
    public R password(String password, String newPassword){
            Assert.isBlank(newPassword, "新密码不为能空");
            
            //sha256加密
            password = new Sha256Hash(password, getUser().getSalt()).toHex();
            //sha256加密
            newPassword = new Sha256Hash(newPassword, getUser().getSalt()).toHex();
                    
            //更新密码
            int count = sysUserService.updatePassword(getUserId(), password, newPassword);
            if(count == 0){
                return R.error("原密码不正确");
            }
            
            return R.ok();
    }
    

    相关文章

      网友评论

          本文标题:JAVA自定义注解和AOP配合使用

          本文链接:https://www.haomeiwen.com/subject/hvrdyctx.html