我是靠谱客的博主 奋斗电源,最近开发中收集的这篇文章主要介绍自定义注解AOP实现日志记录-类注解及方法注解-springboot-springcloud一.关键代码二.检查所需配置三.注解使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

自定义注解AOP实现日志记录-类注解及方法注解的实现-springboot-springcloud

  • 一.关键代码
    • ·不需要mongo保存的话,删除mongo相关的所有代码即可
      • 1.创建注解文件:方法注解、类注解
      • 2.创建Aspect切面
  • 二.检查所需配置
  • 三.注解使用
      • 方法注解
      • 类注解

一.关键代码

·不需要mongo保存的话,删除mongo相关的所有代码即可

1.创建注解文件:方法注解、类注解

1.1 类注解

package com.test.common.annotation;
import java.lang.annotation.*;
/**
* 类注解 日志记录
* 其他模块调用时注意问题:
* 1.xml是否引入common模块
* 2.xml和yml是否引入和配置mongo
* 3.是否放入Shiro否则用户信息为空
*/
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassRecord {
// 记录的补充备注
String note() default "";
}

1.2 方法注解

package com.test.common.annotation;
import java.lang.annotation.*;
/**
* 方法审计 注解
* 其他模块调用时注意问题:
* 1.xml是否引入common模块
* 2.xml和yml是否引入和配置mongo
* 3.是否放入Shiro否则用户信息为空
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodRecord {
String note() default "";
}

2.创建Aspect切面

package com.test.common.Aop;
import com.alibaba.fastjson.JSONObject;
import com.test.common.annotation.ClassRecord;
import com.test.common.annotation.MethodRecord;
import com.test.common.utils.ConstantsUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.time.DateFormatUtils;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;
/**
* 记录跟踪的自定义切面yq
*/
@Component
@Aspect
public class RecordAspect {
// 访问的类
private Class clazz;
// 访问的方法
private Method method;
@Autowired
private MongoTemplate mongoTemplate;
// 方法切入点
详情-切点表达式
@Pointcut("@annotation(com.test.common.annotation.MethodRecord)")
private void annotationMethod(){}
// 类切入点
@Pointcut("@within(com.test.common.annotation.ClassRecord)")
private void annotationClass(){}
// 前置通知 - 方法切入点
@Before("annotationMethod()")
private void methodBefore(JoinPoint joinPoint) throws Exception{
saveObj(joinPoint, "Method");
}
// 前置通知 - 类切入点
@Before("annotationClass()")
private void classBefore(JoinPoint joinPoint) throws Exception{
saveObj(joinPoint, "Class");
}
// 保存日志记录
private void saveObj(JoinPoint joinPoint, String type) throws Exception{
clazz = joinPoint.getTarget().getClass();
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
String requestMethod = request.getMethod();
Date date = new Date();
String nowTime = DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss");
JSONObject recordObj = new JSONObject();
// 请求时间
recordObj.put("time", nowTime);
// 访问Ip
recordObj.put("visitIp", getIpAddr(request));
// 服务Ip
recordObj.put("serverIp", request.getRemoteAddr());
// 请求人
recordObj.put("remoteUser", request.getRemoteUser());
// 请求地址
recordObj.put("uri", request.getRequestURI());
recordObj.put("url", request.getRequestURL());
// 请求方式
recordObj.put("method", requestMethod);
// 请求类方法
recordObj.put("signature", joinPoint.getSignature());
// 请求类方法参数
recordObj.put("args", Arrays.toString(joinPoint.getArgs()));
// 日志审计备注
if ("Method".equals(type)) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
if (args == null || args.length == 0) {
method = clazz.getMethod(methodName);
} else {
Class[] argsClasses = new Class[args.length];
for (int i = 0; i < args.length; i++) {
argsClasses[i] = args[i].getClass();
}
method = clazz.getMethod(methodName, argsClasses);
}
// 方法注解
recordObj.put("note", method.getAnnotation(MethodRecord.class).note());
mongoTemplate.save(recordObj.toJSONString(), ConstantsUtils.INFRA_RECORD);
}
if ("Class".equals(type)) {
// 类注解
ClassRecord classRecord = (ClassRecord) clazz.getAnnotation(ClassRecord.class);
recordObj.put("note", classRecord.note());
mongoTemplate.save(recordObj.toJSONString(), ConstantsUtils.INFRA_RECORD);
}
// 临时打印
System.out.println("=================== 日志开始 ===================");
System.out.println("请求时间: " + nowTime);
System.out.println("访问Ip: " + getIpAddr(request));
System.out.println("服务Ip: " + request.getRemoteAddr());
System.out.println("用户信息: " + request.getRemoteUser());
System.out.println("请求地址URI: " + request.getRequestURI());
System.out.println("请求地址URL: " + request.getRequestURL());
System.out.println("请求方式: " + requestMethod);
System.out.println("请求类方法: " + joinPoint.getSignature());
System.out.println("请求类方法参数: " + Arrays.toString(joinPoint.getArgs()));
System.out.println("日志备注: " + recordObj.get("note"));
System.out.println("=================== 日志结束 ===================");
}
// 获取访问IP
private String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
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 "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
// 后置通知
//
@After("annotationMethod()")
//
private void methodAfter() {}
}

二.检查所需配置

xml文件


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

AOP配置类-springboot有自动配置,aop不能使用再添加此类

package com.test.common.Aop;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* aop配置类
* spring 需要添加此注解类才能生效
* springboot有自动配置
*/
@Configuration
@EnableAspectJAutoProxy
public class ConfigAop {
}

三.注解使用

方法注解


@MethodRecord(note = "删除备注123")
@DeleteMapping("/delStorages/{ids}")
public ResponseEntity<Void> delStorages(@PathVariable String ids) throws Exception {
storageService.delStorages(ids);
return ResponseEntity.status(HttpStatus.OK).build();
}

类注解

@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
@ClassRecord
//
<--- 注解在这里
@RequestMapping("/storage")
public class StorageController {
}

最后

以上就是奋斗电源为你收集整理的自定义注解AOP实现日志记录-类注解及方法注解-springboot-springcloud一.关键代码二.检查所需配置三.注解使用的全部内容,希望文章能够帮你解决自定义注解AOP实现日志记录-类注解及方法注解-springboot-springcloud一.关键代码二.检查所需配置三.注解使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部