SpringBoot-AOP-LOG

学以致用,欢迎转载,更多联系QQ:289325414

springboot-aop log 应用

通过AOP切面编程。在控制器的时候获取log

可以获取到3个内容

1、log需要保存的参数

2、请求接收到post请求内容(也可以是get请求的内容)

3、request 中含有的信息

目录

一、添加maven 引用

二、创建Log注解类

三、AOP-LOG切面类

四、Demo类


一、添加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参数

源码:

https://github.com/chenjunwei111/aop-log

猜你喜欢

转载自blog.csdn.net/qq_37203082/article/details/103735577