Spring Cloud 指定包、類、方法名實現AOP切片登陸記錄統計功能
阿新 • • 發佈:2018-11-21
1. 所需 jar 包:
<!--tools--> <properties> <commons.collections4.version>4.1</commons.collections4.version> <commons.lang3.version>3.4</commons.lang3.version> <dom4j.version>1.6.1</dom4j.version> </properties> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>${commons.collections4.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId><version>${commons.lang3.version}</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>${dom4j.version}</version> </dependency>
2. 程式碼:
package com.dmap.auth.aop; importorg.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; @Aspect @Component public class LoginHistoryV1Aop { //只匹配 api 包中以下 5 個類中的以 ogin 結尾的方法 @Pointcut("execution(public * com.dmap.auth.controller.api.LoginController.*ogin(..)) " + "|| execution(public * com.dmap.auth.controller.api.QQController.*ogin(..)) " + "|| execution(public * com.dmap.auth.controller.api.WechatController.*ogin(..)) " + "|| execution(public * com.dmap.auth.controller.api.WeboController.*ogin(..)) " + "|| execution(public * com.dmap.auth.controller.api.LenovoController.*ogin(..))") public void loginHistoryLog() { //Do nothing in this method. } @AfterReturning(pointcut = "loginHistoryLog()", returning = "object") public void doAfterReturning(JoinPoint joinPoint, Object object) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request; String tempIp = ""; if (attributes != null) { request = attributes.getRequest(); if (request != null) { tempIp = request.getRemoteAddr(); } } String ip = tempIp;//獲得 ip 地址 Object value = object; //object 是切片所攔截的方法的返回值 String classMethod = joinPoint.getSignature().getName();//獲得呼叫的方法名稱 } }