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

發佈了29 篇原創文章 · 獲贊 52 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章