从零开始搭建自己的网站二十四:使用注解记录操作日志

对于一个网站来说肯定需要记录操作日志,比如在几点几分,进行了登录,几点几分删除了一篇文章等这些操作日志。

我们使用AOP+注解的方式来进行记录操作日志。

在下面的代码中,需要注意的就是方法上注解要写在第一行

/**
 * 操作前日志,用于注销,获取用户名和ID
 */
@Target(value = {ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemServiceLogBefore {

    /**
     * 操作类型,必填
     */
    String action();

    /**
     * 操作的模块
     */
    String module() default "";

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

    /**
     * 操作类型,必填
     */
    String action();

    /**
     * 操作的模块
     */
    String module() default "";

}
/**
 * 切面类
 */
@Aspect
@Component
public class SystemLogAspect {

    private static final Logger logger = Logger.getLogger(SystemLogAspect.class);

    @Autowired
    private LogInfoDao logInfoDao;

    /**
     * Service层切点
     */
    @Pointcut("@annotation(com.dyw.utils.log.SystemServiceLog)")
    public void serviceAspect() {

    }

    /**
     * Service层切点
     */
    @Pointcut("@annotation(com.dyw.utils.log.SystemServiceLogBefore)")
    public void serviceAspectBefore() {

    }

    /**
     * 获取注解参数,记录日志
     *
     * @param joinPoint 切入点参数
     */

    @After("serviceAspect()")
    public void doServiceLog(JoinPoint joinPoint) {
        createLog(joinPoint);
    }

    @Before("serviceAspectBefore()")
    public void serviceAspectBefore(JoinPoint joinPoint) {
        createLog(joinPoint);
    }

    /**
     * 获取 操作指令
     */
    private String getMethodActionAndModule(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 action = "";
        String module = "";
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                Class[] clazzs = method.getParameterTypes();
                if (clazzs.length == arguments.length) {
                    Annotation[] annotations = method.getAnnotations();
                    try{
                        //用annotations[0],使用注解的时候必须把注解放在第一行
                        SystemServiceLog systemServiceLog = (SystemServiceLog) annotations[0];
                        action = systemServiceLog.action();
                        module = systemServiceLog.module();
                    }catch (Exception e){
                        SystemServiceLogBefore systemServiceLog = (SystemServiceLogBefore) annotations[0];
                        action = systemServiceLog.action();
                        module = systemServiceLog.module();
                    }
                }
            }
        }
        if(StringUtils.isNotBlank(module)){
            return action + "-" + module;
        }
        return action;
    }

    private void createLog(JoinPoint joinPoint) {
        logger.info("日志记录");
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        LogInfo logInfo = new LogInfo();
        try {
            //获取操作行为及操作模块
            String am = getMethodActionAndModule(joinPoint);
            logInfo.setOperate(am);
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        User user = (User) request.getSession().getAttribute("user");
        //操作时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String operateTime = sdf.format(new Date());
        //判断是pc端还是手机
        String equipment;
        String userAgent = request.getHeader("User-Agent");
        boolean pcFlag = userAgent != null && (userAgent.toUpperCase().contains("WINDOWS") || userAgent.toUpperCase().contains("MACINTOSH"));
        if (pcFlag) {
            //pc端
            equipment = "pc";
        } else {
            equipment = "mobile";
        }
        if (user != null) {
            logInfo.setUserid(String.valueOf(user.getId()));
            logInfo.setUsername(user.getUsername());
        }
        logInfo.setIPAddress(IPUtils.getRemoteIp(request));
        logInfo.setOperatetime(operateTime);
        logInfo.setDevice(equipment);
        logInfoDao.addLogInfo(logInfo);
    }
}
/**
 * 操作常量
 */
public class ActionConstants {

    public static final String LOGIN = "登录";

    public static final String LOGOUT = "注销";

    public static final String INSERT = "新增操作";

    public static final String UPDATE = "更新操作";

    public static final String DELETE = "删除操作";

    public static final String UPLOAD = "上传文件";

    public static final String HANDLE = "办理";
}
/**
 * 模块常量
 */
public class ModuleConstants {

    public static final String USER = "用户";
    public static final String ARTICLE = "文章";
    public static final String CATEGORY = "类别";
    public static final String KEYWORD = "关键字";

}
/**
 * 登录用户
 */
@SystemServiceLog(action = ActionConstants.LOGIN)
@RequestMapping("/loginUser")
@ResponseBody
public String loginUser(HttpServletRequest request, String username, String password) {
    if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) {
        User login = userService.login(username, password);
        if (login != null) {
            request.getSession().setAttribute("user", login);
            return "success";
        }
    }
    return "fail";
}

/**
 * 注销登录
 */
@SystemServiceLogBefore(action = ActionConstants.LOGOUT)
@RequestMapping("/outLogin")
public String outLogin(HttpServletRequest request) {
    request.getSession().setAttribute("user", null);
    return "redirect:/login/login";
}


评论 抢沙发

表情
  1. #1

    来自 匿名 的用户 (2019-05-26 00:27:42)

    [em_38]

    27.129.195.68
    回复
  2. #2

    来自 匿名 的用户 (2019-06-02 20:23:39)

    备注

    218.68.102.109
    回复
  3. #3

    来自 匿名 的用户 (2019-06-02 20:23:55)

    [em_4]

    218.68.102.109
    回复
  4. #4

    来自 匿名 的用户 (2019-07-12 00:47:16)

    [em_1]

    112.10.80.129
    回复
Title