springboot-spring aopは、システム操作ログレコードのデータベースへの保存を実現します

解決策:SpringのAOPテクノロジーを使用して、カスタムアノテーションに切り替え、さまざまなアノテーションフラグのパラメーターを分析し、ログを記録します。
欠点は、さまざまなアノテーションフラグごとに別々にアノテーションフラグを取得し、ログ出力のパラメーターを取得することです。

  1. 依存関係
org.springframework.boot spring-boot-starter-aop

このような構成をapplication.propertiesファイルに
追加します。spring.aop.auto= true //この構成はサンプルに追加されず、正常に動作します
。2.エンティティークラスを作成します。public
クラスSysLog implements 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.アノテーションにスプリングAOP技術カスタムカット、アノテーションは、カスタムクラスの作成
インポートjava.lang.annotationを* .;

/ **

  • カスタムアノテーションクラス
    * /
    @Target(ElementType.METHOD)//アノテーションが配置されるターゲット位置、メソッドレベルでメソッドにアノテーションが付けられる
    @Retention(RetentionPolicy.RUNTIME)//どの段階でアノテーションが実行されるか
    @Documented //ドキュメントを生成する
    public @interface MyLog {
    String value()default“”;
    }
  1. 创建aop切面実際现类
    import com.alibaba.fastjson.JSON;
    import com.qfedu.rongzaiboot.annotation.MyLog;
    import com.qfedu.rongzaiboot.entity.SysLog;
    import 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;

/ **

  • システムログ:アスペクト処理クラス
    * /
    @Aspect
    @Component
    public class SysLogAspect {

    @Autowired
    プライベートSysLogService sysLogService;

    //ポイントカットを定義します@Pointcut
    //コードでカットします
    @Pointcut( "@アノテーション(com.qfedu.rongzaiboot.annotation.MyLog)")
    public void logPoinCut(){
    }

    //セクション構成通知
    @ AfterReturning( "logPoinCut()")
    public void saveSysLog(JoinPoint joinPoint){
    System.out.println( " Slices ...");
    //ログを保存
    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.次AOPはメソッドでカスタム注釈を追加することができる監視が必要
アノテーションのフォーマットを+カスタムクラス名@MyLog
//例えばメソッドcontollerクラスに注釈を付け
@RestController
@RequestMapping(「/ SYS / menu ")
public class SysMenuController extends 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(参照)
public class HttpContextUtils {
public static HttpServletRequest getHttpServletRequest(){
return((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())。getRequest();
}
}

import javax.servlet.http.HttpServletRequest;

パブリッククラスIPUtils {
public static String getIpAddr(HttpServletRequest request){
String ip = request.getHeader(“ x-real-ip”);

if(ip == null || ip.length()== 0 || "unknown" .equalsIgnoreCase(ip)){
ip = request.getHeader( "x-forwarded-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.上記のメソッドを実行すると、レコードがデータベースに保存されます

オリジナル記事を掲載 Like1 Visits 36

おすすめ

転載: blog.csdn.net/qq_37523371/article/details/105610512