1. 程式人生 > >使用AOP同一處理WEB請求日誌

使用AOP同一處理WEB請求日誌

在實際開發中,我們可能會經常用到log.info(),這句程式碼會出現多次,使程式碼比較冗餘,通過aop原理可以幫助我們減少冗餘程式碼。

需要在pom檔案中引入aop的依賴:

<!-- 引入aop依賴 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

編寫aop日誌記錄類:

package wyh.aop;

import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
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 WebLogAspect {

	
	private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
	
	@Pointcut("execution(public * wyh.controller.*.*(..))")//表示攔截public 任意返回值的wyh.controller 這個包下面的所有類的所有方法,(..)表示任意引數列表
	public void webLog() {
		
	}
	
	
	
	/**
	 * 
	 * <p>Title: doBefore</p>  
	 * <p>Description:aop的前置通知 ,攔截請求引數資訊</p>  
	 * @param joinPoint
	 * @throws Throwable
	 */
	@Before("webLog()")
	public void doBefore(JoinPoint joinPoint) throws Throwable{
		/*接收到請求將其轉換為原生的servlet,記錄請求內容,日誌一般記錄在NoSQL資料庫中
		 * 
		 */
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		HttpServletRequest request = attributes.getRequest();
		//通過原生servlet獲取URL等資訊,記錄下請求內容
		logger.info("URL:"+request.getRequestURL().toString());
		logger.info("HTTP_METHOD:"+request.getMethod());
		logger.info("IP:"+request.getRemoteAddr());
		Enumeration<String> enu = request.getParameterNames();
		while(enu.hasMoreElements()) {
			String name = (String)enu.nextElement();
			logger.info("name:{},value:{}",name,request.getParameter(name));
		}
		System.out.println(System.currentTimeMillis());
	}
	
	
	/**
	 * 
	 * <p>Title: doAfterReturning</p>  
	 * <p>Description: 後置通知 </p>  
	 * @param ret
	 * @throws Throwable
	 */
	@AfterReturning(returning = "ret" ,pointcut="webLog()")
	public void doAfterReturning(Object ret) throws Throwable{
		//處理完請求,返回內容
		logger.info("RESPONSE:"+ret+System.currentTimeMillis());
		
	}
}

編寫controller

@RequestMapping("/getMember")
	public String getMember(String name,Integer age) {
		return "success"+System.currentTimeMillis();
	}

在列印輸出時我加上了系統當前時間,便於證明前置增強和後置增強的實際執行時間,訪問結果:日誌資訊在控制檯中列印輸出