學以致用,歡迎轉載,更多聯繫QQ:289325414
springboot-aop log 應用
通過AOP切面編程。在控制器的時候獲取log
可以獲取到3個內容
1、log需要保存的參數
2、請求接收到post請求內容(也可以是get請求的內容)
3、request 中含有的信息
目錄
一、添加maven 引用
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dalaoyang</groupId>
<artifactId>springboot_aop</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot_aop</name>
<description>springboot_aop</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
二、創建Log註解類
package com.dalaoyang.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Description 註解類
* @Author junwei
* @Date 16:00 2019/12/27
**/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
//參數1
String param1() default "";
//參數2
String param2() default "";
//以此類推。。需要新增參數的話,繼續加
}
三、AOP-LOG切面類
package com.dalaoyang.aspect;
import com.dalaoyang.annotation.Log;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
/**
* Description AOP切面類
* @Author junwei
* @Date 16:39 2019/12/27
**/
@Aspect
@Component
public class LogAspect {
@Pointcut("execution(public * com.dalaoyang.controller.*.*(..))")
public void LogAspect(){}
@Around(value = "LogAspect() && @annotation(log) &&args(object,..) ")
public Object around(ProceedingJoinPoint joinPoint, Log log, Object object) throws Throwable {
try {
//獲取request信息
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//輸出IP地址
System.out.println(getIpAddress(request));
//輸出LOG日誌參數
System.out.println(log.param1());
//輸出POST請求接收到的參數
System.out.println(object);
return joinPoint.proceed();
} catch (Exception e) {
e.printStackTrace();
return joinPoint.proceed();
}
}
/**
* Description 獲取IP地址
*
* @param request
* @Author junwei
* @Date 10:51 2019/10/28
**/
public static String getIpAddress(ServletRequest request) {
String ip = ((HttpServletRequest) request).getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
// @Before("LogAspect()")
// public void doBefore(JoinPoint joinPoint){
// System.out.println("doBefore");
// }
//
// @After("LogAspect()")
// public void doAfter(JoinPoint joinPoint){
// System.out.println("doAfter");
// }
//
// @AfterReturning("LogAspect()")
// public void doAfterReturning(JoinPoint joinPoint){
// System.out.println("doAfterReturning");
// }
//
// @AfterThrowing("LogAspect()")
// public void deAfterThrowing(JoinPoint joinPoint){
// System.out.println("deAfterThrowing");
// }
//
// @Around("LogAspect()")
// public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
// System.out.println("deAround");
// return joinPoint.proceed();
// }
}
四、Demo類
package com.dalaoyang.controller;
import com.dalaoyang.annotation.Log;
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.RestController;
import java.util.Map;
/**
* Description 主頁
* @Author junwei
* @Date 15:57 2019/12/27
**/
@RestController
public class IndexController {
@PostMapping("/index")
@Log(param1= "參數1" ,param2 = "參數2")
public String index(@RequestBody Map<String, Object> obj){
System.out.println(obj);
return "hello dalaoyang";
}
@GetMapping("/index2")
public String index2(){
System.out.println("方法2執行");
return "hello dalaoyang";
}
}
代碼結構:
測試例子:
使用postman模擬post請求
JAVA代碼輸出
獲取到log註解類、request、輸入的json參數
源碼: