使用AOP同一處理WEB請求日誌
阿新 • • 發佈:2018-12-03
在實際開發中,我們可能會經常用到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();
}
在列印輸出時我加上了系統當前時間,便於證明前置增強和後置增強的實際執行時間,訪問結果:日誌資訊在控制檯中列印輸出