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.
- Dependencias dependientes
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 "";
}
- 创建 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