1、引入spring-aop組件 和 fastjson組件
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop
compile group: 'org.springframework.boot', name: 'spring-boot-starter-aop', version: '2.1.10.RELEASE'
// https://mvnrepository.com/artifact/com.alibaba/fastjson
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.66'
2、自定義註解@AuditLog
package middol.annotation;
import java.lang.annotation.*;
/**
* @Description: 系統日誌
* @Author: [email protected]
* @CreateDate: 2020/3/19 20:51
* @Version: 1.0
*/
//註解在方法上
@Target(ElementType.METHOD)
//再運行時
@Retention(RetentionPolicy.RUNTIME)
//文檔
@Documented
public @interface AuditLog {
/**
* 日誌內容
* @return
*/
String value() default "";
/**
* 日誌類型
* @return
*/
int logType() default 1;
/**
* 操作類型 (增刪改查)
* @return
*/
int optionType() default 0;
}
3、創建日誌切面
package middol.aops;
import com.alibaba.fastjson.JSONObject;
import middol.IpUtils;
import middol.annotation.AuditLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
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 java.lang.reflect.Method;
@Aspect
@Component
public class AuditLogAspect {
@Pointcut("@annotation(middol.annotation.AuditLog)")
public void auditLog(){
}
@Around("auditLog()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
long beginTime = System.currentTimeMillis();
//執行方法
Object proceed = joinPoint.proceed();
//執行時長
long time = System.currentTimeMillis() - beginTime;
//保存日誌
saveLog(joinPoint, time);
return proceed;
}
private void saveLog(ProceedingJoinPoint joinPoint, long time) {
//獲取目標對象
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
//獲取目標方法
Method method = signature.getMethod();
AuditLog auditLog = method.getAnnotation(AuditLog.class);
if(auditLog != null){
//獲取註解上的描述,操作日誌內容
System.out.println(auditLog.value());
System.out.println(auditLog.logType());
System.out.println(auditLog.optionType());
}
//獲取請求的方法名
String className = joinPoint.getSignature().getDeclaringTypeName();
String methodName = method.getName();
System.out.println(className +"."+methodName+"()");
//獲取操作類型
int optionType = auditLog.optionType();
System.out.println(optionType);
//獲取請求參數
Object[] args = joinPoint.getArgs();
//使用fastjson 將object對象轉換爲字符串
System.out.println("參數:"+JSONObject.toJSONString(args));
//獲取request信息
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
/**如果是用nginx反向代理的話 request.getRemoteAddr() 不能獲取ip
* 如果使用了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串IP地址,X-Forwarded-For中第一個非unknown的有效IP字符串,則爲真實IP地址
*/
String ip = IpUtils.getIpAddr(request);
System.out.println(ip);
//獲取url參數
System.out.println(request.getQueryString());
//獲取登錄信息,如果你用security插件 則是 springSecurityService.getPrincipal()?.getUsername()
String usename = "SYS";
}
}
4、測試
IpUtils工具類
package middol;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
/**
* @Description: IP工具類
* @Author: [email protected]
* @CreateDate: 2020/3/19 21:37
* @Version: 1.0
*/
public class IpUtils {
private static Logger logger = LoggerFactory.getLogger(IpUtils.class);
/**
* 獲取IP地址
*
* 使用Nginx等反向代理軟件, 則不能通過request.getRemoteAddr()獲取IP地址
* 如果使用了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串IP地址,X-Forwarded-For中第一個非unknown的有效IP字符串,則爲真實IP地址
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = null;
try {
ip = request.getHeader("x-forwarded-for");
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} catch (Exception e) {
logger.error("IPUtils ERROR ", e);
}
// //使用代理,則獲取第一個IP地址
// if(StringUtils.isEmpty(ip) && ip.length() > 15) {
// if(ip.indexOf(",") > 0) {
// ip = ip.substring(0, ip.indexOf(","));
// }
// }
return ip;
}
}