<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
SpringBoot 使用 AOP 記錄介面操作紀錄檔,供大家參考,具體內容如下
1.什麼是AOP
AOP:Aspect Oriented Programming 面向切面程式設計
AOP關注不是某一個類或某些方法;控制大量資源,關注的是大量的類和方法。
2.AOP應用場景以及常用術語
3.AOP的特點
1)降低模組與模組之間的耦合度,提高業務程式碼的聚合度。(高內聚低耦合)
2)提高了程式碼的複用性
3)提高系統的擴充套件性。(高版本相容低版本)
4)可以在不影響原有的功能基礎上新增新的功能
1.引入依賴
<!-- Spring AOP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.封裝記錄紀錄檔實體類
@Getter @Setter @ApiModel(value = "Systemlog物件", description = "") public class Systemlog implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty("ID") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty("使用者名稱") private String userName; @ApiModelProperty("使用者ID") private Integer userId; @ApiModelProperty("操作描述") private String operate; @ApiModelProperty("模組") private String module; @ApiModelProperty("建立紀錄檔時間") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; @ApiModelProperty("操作結果") private String result; }
3.編寫註解類(自定義紀錄檔註解類)
/** * controller層切面紀錄檔註解 * @author hsq */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface SystemControllerLog { // 操作描述 String operate(); // 模組 String module(); }
4.編寫操作紀錄檔的切面類
** * @author hsq */ @Aspect @Component public class SystemLogAspect { private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect.class); @Autowired private ISystemlogService iSystemlogService; @Autowired private UserService userService; /** * Controller層切點 */ @Pointcut("@annotation(com.hsq.demo.config.SystemControllerLog)") public void SystemControllerLog(){ } /** * 前置通知 用於攔截Controller層記錄使用者的操作的開始時間 * @param joinPoint 切點 * @throws InterruptedException */ @Before("SystemControllerLog()") public void doBefore(JoinPoint joinPoint) throws InterruptedException{ logger.info("進入紀錄檔切面前置通知!"); } @After("SystemControllerLog()") public void doAfter(JoinPoint joinPoint) { logger.info("進入紀錄檔切面後置通知!"); } /**value切入點位置 * returning 自定義的變數,標識目標方法的返回值,自定義變數名必須和通知方法的形參一樣 * 特點:在目標方法之後執行的,能夠獲取到目標方法的返回值,可以根據這個返回值做不同的處理 */ @AfterReturning(value = "SystemControllerLog()", returning = "ret") public void doAfterReturning(Object ret) throws Throwable { } /*** * 異常通知 記錄操作報錯紀錄檔 * * @param joinPoint * * @param e * */ @AfterThrowing(pointcut = "SystemControllerLog()", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, Throwable e) { logger.info("進入紀錄檔切面異常通知!!"); logger.info("異常資訊:" + e.getMessage()); } //使用這個方法先註釋前面三個方法,留before方法就行 /** * 通知包裹了目標方法,在目標方法呼叫之前和之後執行自定義的行為 * ProceedingJoinPoint切入點可以獲取切入點方法上的名字、引數、註解和物件 * @param joinPoint */ @Around("SystemControllerLog() && @annotation(systemControllerLog)") public Result doAfterReturning(ProceedingJoinPoint joinPoint, SystemControllerLog systemControllerLog) throws Throwable { logger.info("設定紀錄檔資訊儲存到表中!"); //joinPoint.proceed() 結果集 //引數陣列 Object[] args = joinPoint.getArgs(); //請求引數資料 String requestJson = JSONUtil.toJsonStr(args); //方法名 String methodName = joinPoint.getSignature().getName(); //得到request HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); //得到token String token = request.getHeader("token"); String userId = JWT.decode(token).getAudience().get(0); User user = userService.getById(userId); logger.info("得到使用者資訊:"+user.toString()); //寫入資料庫操作紀錄檔 Systemlog systemlog = new Systemlog(); systemlog.setUserId(user.getUid()); systemlog.setUserName(user.getUname()); systemlog.setOperate(systemControllerLog.operate()); systemlog.setModule(systemControllerLog.module()); systemlog.setCreateTime(new Date()); //存入返回的結果集 joinPoint.proceed() Result proceed = (Result) joinPoint.proceed(); systemlog.setResult(JSONUtil.toJsonStr(joinPoint.proceed())); //儲存 saveSystemLog(systemlog); return proceed; } }
5.controller使用
@GetMapping("/userListPage") @SystemControllerLog(operate = "使用者查詢",module = "使用者管理") public Result findUserList( @RequestParam Integer pageNum, @RequestParam Integer pageSize, @RequestParam String username, @RequestParam String loveValue, @RequestParam String address) {} @PostMapping("/addOrUpdate") @SystemControllerLog(operate = "使用者修改或者新增",module = "使用者管理") public Result addOrUpdateUser(@RequestBody User user){}
6.資料庫記錄
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45