springboot: spring aop realiza el almacenamiento de los registros de operación del sistema en la base de datos

Solución: utilice la tecnología AOP de Spring para cambiar a anotaciones personalizadas, analizar parámetros para diferentes indicadores de anotación y registrar registros. La
desventaja es tomar los indicadores de anotación por separado para cada indicador de anotación diferente y obtener parámetros para registrar la salida.

  1. Dependencias dependientes
org.springframework.boot spring-boot-starter-aop


Agregue dicha configuración en el archivo application.properties spring.aop.auto = true // Esta configuración no se agrega en mi ejemplo y funciona normalmente
2. Cree una clase de entidad clase
pública SysLog implementa Serializable {
private Long id;

private String username; //用户名

private String operation; //操作

private String method; //方法名

private String params; //参数

private String ip; //ip地址

private Date createDate; //操作时间
//创建getter和setter方法

}
3. Utilice la tecnología aop de spring para cambiar a anotaciones personalizadas, por lo que primero cree una clase de anotación personalizada
import java.lang.annotation. *;

/ **

  • Clase de anotación personalizada
    * /
    @Target (ElementType.METHOD) // La posición de destino donde se coloca la anotación, METHOD se puede
    anotar en el nivel de método @Retention (RetentionPolicy.RUNTIME) // La etapa en la que se ejecuta la anotación
    @Documented // Generar el documento
    público @interface MyLog {
    Valor de cadena () predeterminado "";
    }
  1. 创建 aop 切面 实现 类
    import com.alibaba.fastjson.JSON;
    import com.qfedu.rongzaiboot.annotation.MyLog;
    import com.qfedu.rongzaiboot.entity.SysLog;
    importar com.qfedu.rongzaiboot.service.SysLogService;
    import com.qfedu.rongzaiboot.utils.HttpContextUtils;
    import com.qfedu.rongzaiboot.utils.IPUtils;
    import com.qfedu.rongzaiboot.utils.ShiroUtils;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    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;

/ **

  • Registro del sistema: Clase de procesamiento de aspecto
    * /
    @Aspect
    @Component
    public class SysLogAspect {

    @Autowired
    private SysLogService sysLogService;

    // Defina el punto de
    corte @Pointcut // corte en el código
    @Pointcut ("@ annotation (com.qfedu.rongzaiboot.annotation.MyLog)")
    public void logPoinCut () {
    }

    // Notificación de configuración de sección
    @ AfterReturning ("logPoinCut ()")
    public void saveSysLog (JoinPoint joinPoint) {
    System.out.println (" Slices ...");
    // Guardar registro
    SysLog sysLog = new SysLog ();

     //从切面织入点处通过反射机制获取织入点处的方法
     MethodSignature signature = (MethodSignature) joinPoint.getSignature();
     //获取切入点所在的方法
     Method method = signature.getMethod();
    
     //获取操作
     MyLog myLog = method.getAnnotation(MyLog.class);
     if (myLog != null) {
         String value = myLog.value();
         sysLog.setOperation(value);//保存获取的操作
     }
    
     //获取请求的类名
     String className = joinPoint.getTarget().getClass().getName();
     //获取请求的方法名
     String methodName = method.getName();
     sysLog.setMethod(className + "." + methodName);
    
     //请求的参数
     Object[] args = joinPoint.getArgs();
     //将参数所在的数组转换成json
     String params = JSON.toJSONString(args);
     sysLog.setParams(params);
    
     sysLog.setCreateDate(new Date());
     //获取用户名(可通过request去获取到usertoken)
     sysLog.setUsername(ShiroUtils.getUserEntity().getUsername());
     //获取用户ip地址
     HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
     sysLog.setIp(IPUtils.getIpAddr(request));
    
     //调用service保存SysLog实体类到数据库
     sysLogService.save(sysLog);
    

    }

}
5. A continuación, puede agregar la anotación personalizada de aop al método que necesita ser monitoreado. El
formato es @ + Nombre de clase de anotación personalizada @MyLog
// Por ejemplo, agregue una anotación
@RestController
@RequestMapping ("/ sys al método de la clase de controlador / menu ")
clase pública SysMenuController extiende AbstractController {

@Autowired
private SysMenuService sysMenuService;

@MyLog(value = "删除菜单记录")  //这里添加了AOP的自定义注解
@PostMapping("/del")
public R deleteBatch(@RequestBody Long[] menuIds) {
    for (Long menuId : menuIds) {
        if (menuId <= 31) {
            return R.error("系统菜单,不能删除");
        }
    }
    sysMenuService.deleteBatch(menuIds);

    return R.ok("删除成功");
}

}
6. 网上 找 的 utils (可 参考)
clase pública HttpContextUtils {
public static HttpServletRequest getHttpServletRequest () {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes ()). GetRequest ();
}
}

import javax.servlet.http.HttpServletRequest;

IPUtils de clase pública {
Cadena estática pública getIpAddr (solicitud HttpServletRequest) {
Cadena ip = request.getHeader ("x-real-ip");

if (ip == null || ip.length () == 0 || “unknown” .equalsIgnoreCase (ip)) {
ip = request.getHeader (“x-forwards-for”);
if (ip! = null) {
ip = ip.split (",") [0] .trim ();
}
}

if (ip == null || ip.length () == 0 || "unknown" .equalsIgnoreCase (ip)) {
ip = request.getHeader ("Proxy-Client-IP");
}

if (ip == null || ip.length () == 0 || “unknown” .equalsIgnoreCase (ip)) {
ip = request.getHeader (“WL-Proxy-Client-IP”);
}

if (ip == null || ip.length () == 0 || "unknown" .equalsIgnoreCase (ip)) {
ip = request.getRemoteAddr ();
}

return ip;
}
}
7. Después de ejecutar el método anterior, el registro se guardará en la base de datos

Publicó un artículo original · Me gusta1 · Visitas 36

Supongo que te gusta

Origin blog.csdn.net/qq_37523371/article/details/105610512
Recomendado
Clasificación