学以致用,欢迎转载,更多联系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参数
源码: