AOP统一处理请求日志

1. 添加依赖

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-aop</artifactId>
</dependency>
<!-- 面向切面框架(aspectj) -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

2. 创建处理文件 aspect

             

package com.it.demo.aspect;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Aspect
@Component
/**
 * 记录请求的日志
**/
public class HttpAspect {
	
    //spring 中的日志框架(底层实现是 loggerFactory)
	private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    
        /**
         *需要切入的点(pointcut)
	     *execution(public * com.it.demo.Controller.GirlController.*(..)) 表示执行 任意 
         *    返回值,com.it.demo.Controller.GirlController中所有方法(任意参数)       
        **/   
	@Pointcut("execution(public * com.it.demo.Controller.GirlController.*(..))")
	public void log() {}

	@Before("log()")
	public void beforeLog(JoinPoint joinPoint) {
		//获得请求中的属性
		ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		
		//获得请求
		HttpServletRequest request = servletRequestAttributes.getRequest();
		
		// 记录请求
		//1.url
		logger.info("url={}", request.getRequestURL());

		//2.请求方式
		logger.info("metho={}", request.getMethod());

		//3.客户端的IP
		logger.info("client_IP={}", request.getRemoteAddr());

		//4.请求执行的controller中的那个方法    
		/**
		 * joinPoint.getSignature().getDeclaringTypeName() --- 获得类名
		 * joinPoint.getSignature().getName() ---- 获得方法名
		 */
		logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() +"."+ joinPoint.getSignature().getName());

		//5.请求参数......
		logger.info("args={}", joinPoint.getArgs());
		
		logger.info("请求进入controller");
	}

	@After("log()")
	public void afterLog() {
		logger.info("执行方法后响应");
	}
	
        //获得放回的结果
	@AfterReturning(returning = "object", pointcut = "log()")
	public void afterReturningLog(Object object) {
		logger.info("response={}", object);
		System.out.println("返回结果之后");
	}
	
}

3. 执行(获得列表的方法)结果

猜你喜欢

转载自blog.csdn.net/weixin_42367340/article/details/82945077