zoukankan      html  css  js  c++  java
  • 在SSM框架中定义日志信息

    一、首先定义一个log的日志(TLog.java);

    package entity;
    import java.util.Date;
    public class TLog {
      private Integer id;
      private String type;
      private Integer operator;
      private Date createtime;
      private String data;
      private String ip;
      private String content;
      public Integer getId() {
        return id;
      }
      public void setId(Integer id) {
        this.id = id;
      }
      public String getType() {
        return type;
      }
      public void setType(String type) {
        this.type = type;
      }
      public Integer getOperator() {
        return operator;
      }
      public void setOperator(Integer operator) {
        this.operator = operator;
      }
      public Date getCreatetime() {
        return createtime;
      }
      public void setCreatetime(Date createtime) {
        this.createtime = createtime;
      }
      public String getData() {
        return data;
      }
      public void setData(String data) {
        this.data = data;
      }
      public String getIp() {
        return ip;
      }
      public void setIp(String ip) {
        this.ip = ip;
      }
      public String getContent() {
        return content;
      }
      public void setContent(String content) {
        this.content = content;
      }
    }

    二、用自定义注解来来定义接口(Log.java);

    @Target({ElementType.METHOD})//指定注解添加到method方法上
    @Retention(RetentionPolicy.RUNTIME)//指定作用域为运行时
    public @interface Log {
        //定义接口方法,使用接口时,会当做注解的属性
        String description() default "";
        //日志操作类型,删除,修改,登录,查询,新增
        LogType logType();
    }

    三、利用枚举来定义日志的操作(LogType.java);

    /**
     * 枚举类,用来定义有限个的对象
     */
    public enum LogType {
        LOGIN("1"),INSERT("2"),DELETE("3")
        ,SELECT("4"),UPDATE("5"),PASSWORD("6");
        //定义类中的属性和方法,跟写其他类一样
        private String type;
        LogType(String type){
            this.type=type;
        }
        public String getType() {
            return type;
        }
    }

    四、分别在mapper层和service层定义insert方法;

    mapper层:
    LogMapper.java
    public interface LogMapper {
        int insert(TLog tLog);
    }
    LogMapper.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="mapper.LogMapper">
    
        <insert id="insert">
            insert into T_LOG(id, type, operator, createtime, data, ip, content)
            values (SEQ_T_LOG.nextval,#{type},#{operator},#{createtime},#{data},#{ip},#{content})
        </insert>
    </mapper>
    
    service层:
    LogService.java
    public interface LogService {
        int insert(TLog tLog);
    }
    LogServiceImpl.java
    @Service
    public class LogServiceImpl implements LogService{
        @Autowired
        private LogMapper logMapper;
        @Override
        public int insert(TLog tLog) {
            return logMapper.insert(tLog);
        }
    }

    五、我们最后写一个切面的类来实现我们的日志(LogAspect.java);

    @Component
    @Aspect
    public class LogAspect2 {
        @Autowired
        private LogService logService;
        //定义切入点,使用注解的方法
        @Pointcut("@annotation(aop.Log)")
        public void logPointCut(){
    
        }
    
        @Before("logPointCut()")
        public void log(JoinPoint joinPoint) throws JsonProcessingException {
            //获取日志信息,封装成日志对象,并保存到数据库
            TLog tLog = new TLog();
            //获取到方法签名对象
            MethodSignature signature= (MethodSignature) joinPoint.getSignature();
            //通过方法签名对象获取方法对象
            Method method = signature.getMethod();
            //获取方法上面的特定注解
            Log logAnnotation = method.getAnnotation(Log.class);
            //描述信息
            String description = logAnnotation.description();
            //日志类型
            LogType logType = logAnnotation.logType();
            //获取到日志类型对应的数字,存入tLog对象中
            tLog.setType(logType.getType());
            //设置操作时间
            tLog.setCreatetime(new Date());
            //获取request对象
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest();
            //获取客户端IP地址
            String ip = request.getRemoteUser();
            tLog.setIp(ip);
            //获取请求数据
            Map<String, String[]> parameterMap = request.getParameterMap();
            //创建JackSon的ObjectMapper对象,通过该对象将java对象转换成json
            ObjectMapper objectMapper = new ObjectMapper();
            //将java对象转换成json字符串
            String requestDataJsonStr = objectMapper.writeValueAsString(parameterMap);
            //将json字符串转换成java对象
          //  HashMap map=objectMapper.readValue(s, HashMap,class);
           // String content=description+",请求数据:"+requestDataJsonStr;
            tLog.setContent(description);
            //设置请求数据
            tLog.setData(requestDataJsonStr);
            if (!(LogType.LOGIN ==logType)){//如果不是登录操作,获取操作人信息
                Admin admin = (Admin) request.getSession().getAttribute("admin");
                tLog.setOperator(admin.getId());
            }
            //将日志信息保存到数据库
            logService.insert(tLog);
        }
    }

    六、为了测试结果,我们可以在事先写好的增删改查,登录或修改密码的方法上加上对应的注解,然后我们执行有注解的相关操作即可,就可以在控制台看到相应的日志信息,或者在数据库中看到相应的日志信息;

    1)加入的注解;

    2)控制台的相关信息;

    3)数据库表中页面;

  • 相关阅读:
    使用javap分析Java的字符串操作
    使用javap深入理解Java整型常量和整型变量的区别
    分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
    Java动态代理之InvocationHandler最简单的入门教程
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
  • 原文地址:https://www.cnblogs.com/xie-qi/p/13258267.html
Copyright © 2011-2022 走看看