日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录

發布時間:2025/4/5 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:
任何一個項目都會有一個用戶操作日志(也叫行為日志)的模塊,它主要用來記錄某個用戶做了某個操作,當出現操作失敗時,通過日志就可以快速的查找是哪個用戶在哪個模塊出現了錯誤,以便于開發人員快速定位問題所在。

實現這一功能一般有兩種方法:

  • 第一種就是很傳統的做法,就是在每個模塊進行插入日志的操作(不推薦),這種做法雖然實現了記錄用戶的操作,但很繁瑣而且基本上是重復的工作。
  • 第二種就是使用Spring的AOP來實現記錄用戶操作,也是推薦的現如今都使用的一種做法。它的優勢在于這種記錄用戶操作的代碼獨立于其他業務邏輯代碼,不僅實現了解耦,而且避免了冗余代碼。

具體實現步驟

  • 在pom.xml中添加AOP依賴
  • <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>`
  • 設計操作日志記錄表
  • 新增日志實體類、dao層 接口
  • 自定義操作日志記錄的注解
  • package com.example.springcloud.aop;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** @author lyz* @title: OperationLog* @projectName springcloud* @date 2020/9/23* @description: 自定義操作日志注解*/ @Target(ElementType.METHOD)//注解放置的目標位置即方法級別 @Retention(RetentionPolicy.RUNTIME)//注解在哪個階段執行 @Documented public @interface OperationLogAnnotation {String operModul() default ""; // 操作模塊String operType() default ""; // 操作類型String operDesc() default ""; // 操作說明 }
  • 自定義操作日志切面類,該類是將操作日志保存到數據庫
  • package com.example.springcloud.aop;import com.example.springcloud.dao.OperationLogDao; import com.example.springcloud.domain.OperationLog; import com.example.springcloud.utils.IPUtil; 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 org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder;import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map;/*** @author lyz* @title: OperationAspect* @projectName springcloud* @date 2020/9/23* @description: 操作日志切面處理類*/ @Aspect @Component public class OperationLogAspect {@AutowiredOperationLogDao logDao;private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");/*** 設置操作日志切入點 在注解的位置切入代碼*/@Pointcut("@annotation(com.example.springcloud.aop.OperationLogAnnotation)")public void operLogPoinCut() {}@AfterReturning(returning /*** 記錄操作日志* @param joinPoint 方法的執行點* @param result 方法返回值* @throws Throwable*/ = "result", value = "operLogPoinCut()")public void saveOperLog(JoinPoint joinPoint, Object result) throws Throwable {// 獲取RequestAttributesRequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();// 從獲取RequestAttributes中獲取HttpServletRequest的信息HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);try {//將返回值轉換成map集合Map<String, String> map = (Map<String, String>) result;OperationLog operationLog = new OperationLog();// 從切面織入點處通過反射機制獲取織入點處的方法MethodSignature signature = (MethodSignature) joinPoint.getSignature();//獲取切入點所在的方法Method method = signature.getMethod();//獲取操作OperationLogAnnotation annotation = method.getAnnotation(OperationLogAnnotation.class);if (annotation != null) {operationLog.setModel(annotation.operModul());operationLog.setType(annotation.operType());operationLog.setDescription(annotation.operDesc());}//操作時間operationLog.setOperationTime(Timestamp.valueOf(sdf.format(new Date())));//操作用戶operationLog.setUserCode(request.getHeader("userCode"));//操作IPoperationLog.setIp(IPUtil.getIpAdrress(request));//返回值信息operationLog.setResult(map.get("message"));//保存日志logDao.save(operationLog);} catch (Exception e) {e.printStackTrace();}}}
  • 在controller層的某一個方法加入@OperationLogAnnotation 注解
  • package com.example.springcloud.controller;import com.example.springcloud.aop.OperationLogAnnotation; import com.example.springcloud.domain.User; import com.example.springcloud.service.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest; import java.util.Map;/*** @author lyz* @title: UserController* @projectName springcloud* @date 2020/9/12* @description:*/ @Api(tags = "用戶表") @RestController @RequestMapping("/user") public class UserController {@AutowiredUserService userService;@OperationLogAnnotation(operModul = "用戶模塊-用戶列表",operType = "查詢",operDesc = "查詢所有用戶")@ApiOperation(value = "查詢所有用戶",notes = "這是用來查詢所有用戶列表")@GetMapping("/users")public Object findAll(@RequestParam(required = false)String userName,@RequestParam(required = false)Integer sex,@RequestParam(required = false, defaultValue = "10") int limit,@RequestParam(required = false, defaultValue = "0") int offset,@RequestParam(required = false, defaultValue = "createTime") String sortBy,@RequestParam(required = false, defaultValue = "DESC") String sortFlag, HttpServletRequest request){offset=offset/limit;request.setAttribute("userCode","admin");return userService.findAll(userName,sex,sortBy,sortFlag,offset,limit);}@OperationLogAnnotation(operModul = "用戶模塊-新增用戶",operType = "新增",operDesc = "新增用戶")@PostMapping("/addUser")@ApiOperation(value = "新增用戶",notes = "通過這個方法可以添加新用戶")public Object createUser(@RequestBody Map<String, String>map){return userService.save(map);}}
  • 通過swagger或者postmain進行測試,最后在數據庫中查看操作日志記錄

  • 總結:用戶操作日志是AOP最常見的一種業務場景,這里使用了后置通知,當然也可以也可以使用異常通知記錄異常信息,方法如上。

    原文作者:哥的冷酷,你模仿不來

    原文鏈接:https://segmentfault.com/a/1190000023961648

    原文出處:CSDN

    總結

    以上是生活随笔為你收集整理的中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩淫视频 | av在线短片 | 麻豆亚洲av成人无码久久精品 | 亚洲熟女www一区二区三区 | 播放男人添女人下边视频 | 亚洲熟妇av一区二区三区漫画 | 一极毛片| 国产a级免费 | 狠狠狠狠干 | 久久99草 | 国产精成人 | 国产欧美在线一区 | 邻居校草天天肉我h1v1 | 欧美 日韩 国产 成人 在线观看 | 日韩久久影视 | 在线看黄网 | 狠狠躁 | 在线观看免费人成视频 | 中文精品久久 | 亚洲精品成人无码毛片 | 国产一区二区四区 | 成人一级在线 | 深夜福利电影 | 国内精品卡一卡二卡三 | 欧美性色视频 | 国产精品99一区二区三区 | 欧美自拍偷拍一区 | 天天躁日日躁aaaxxⅹ | 成人午夜剧场视频网站 | 狠狠人妻久久久久久综合 | 欧美肥老妇| 国产91黄色| 99re8在线精品视频免费播放 | 在线观看的黄网 | 国产成人精品一区二 | 极品新婚夜少妇真紧 | 亚洲中文字幕一区 | 欧美久久久精品 | 麻豆www. | 欧美有码在线观看 | 国产人妖ts | 人物动物互动39集免费观看 | 成年人视频免费在线观看 | 中文一区在线观看 | 国产亚洲天堂 | 蜜桃av噜噜一区二区三区 | 久久精品国产亚洲av香蕉 | 超碰久草 | 成人夜视频 | 欧美三级视频在线观看 | 乱h伦h女h在线视频 99999视频 | 国产av一区二区三区 | 亚洲精品国产精 | 伊人久久影视 | 大黄毛片 | 国产第20页 | 国语对白少妇spa私密按摩 | 免费人成视频在线 | 亚洲综合一区在线 | 久久久久久久九九九九 | 久久久久久无码午夜精品直播 | 成人免费看毛片 | 精品免费一区二区 | 91涩漫成人官网入口 | 懂色av一区二区三区免费观看 | 亚洲一区二区三区高清视频 | 在线观看国产小视频 | 国产精品海角社区 | 国产成人精品a视频一区 | 超碰97av在线 | 国产a级一级片 | 成人依依 | 天堂在线中文8 | 91视频免费看 | 欧美精品一线 | 人妻va精品va欧美va | ⅹxxxxhd亚洲日本hd老师 | 久久成人毛片 | 午夜久久久久久噜噜噜噜 | 成人欧美一区二区三区在线播放 | 热99这里只有精品 | 少妇学院在线观看 | 色窝窝无码一区二区三区成人网站 | 国精产品一区一区三区有限公司杨 | 色五婷婷 | 好吊色欧美一区二区三区视频 | 91久久综合亚洲鲁鲁五月天 | 国产一区二区波多野结衣 | 91蝌蚪九色 | 打开免费观看视频在线 | 欧美性猛交久久久久 | 欧美狂猛xxxxx乱大交3 | 久久影片 | 久久99久久精品 | 亚洲久久久久久久 | 97成人精品 | 午夜免费视频观看 | 成人一区二区在线观看 | 亚洲国产爱|