解決策:Springの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“”;
}
- 创建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.上記のメソッドを実行すると、レコードがデータベースに保存されます