業(yè)務(wù)場(chǎng)景:pc端,登陸頁(yè)面,登陸賬戶(hù)后,訪(fǎng)問(wèn)各個(gè)模塊,每次訪(fǎng)問(wèn)和操作都記錄日志.
1.開(kāi)啟aop,就一步.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
application.yml中下面這個(gè)設(shè)置默認(rèn)開(kāi)啟
spring.aop.auto=true
2.增加一個(gè)自定義annotation
package com.yunchuang.config.annotation;
import java.lang.annotation.*;
/**
* 日志
*
* @author 尹冬飛
* @date 2015-07-02 15:43:26
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Log {
/**
* 1.日志內(nèi)容
*/
String value();
}
3.定義切面類(lèi)
package com.yunchuang.config.aspect;
import com.yunchuang.config.annotation.Log;
import com.yunchuang.console.user.domain.User;
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.aspectj.lang.reflect.MethodSignature;
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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* aop切面日志
*
* @author 尹冬飛
* @create 2017-05-02 14:16
*/
@Aspect
@Component
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Pointcut("execution(public * com.yunchuang.console.*.web..*.*(..))")
public void consoleLog() {
}
@Before("consoleLog()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 接收到請(qǐng)求,記錄請(qǐng)求內(nèi)容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//獲取request
HttpServletRequest request = attributes.getRequest();
//獲取session
HttpSession session = request.getSession();
//獲取方法簽名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//獲取方法
Method method = signature.getMethod(); //獲取被攔截的方法
//獲取自定義Log注解
Log annotation = method.getAnnotation(Log.class);
//如果有Log注解,則寫(xiě)入日志
if (annotation != null) {
//獲取session里的用戶(hù)對(duì)象
User user = (User) session.getAttribute("loginUser");
//獲取用戶(hù)名
String name = user != null ? "[" + user.getNickname() + "]" : "";
logger.info(name + "[" + annotation.value() + "][" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName() + "][" + Arrays.toString(joinPoint.getArgs()) + "][" + request.getRemoteAddr() + "]");
}
}
@AfterReturning(returning = "ret", pointcut = "consoleLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 處理完請(qǐng)求,返回內(nèi)容
//logger.info("RESPONSE : " + ret);
}
}
這里關(guān)鍵的2個(gè)地方:
獲取方法,就能獲取自定義注解,就能獲取里面的值
//獲取方法簽名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
獲取請(qǐng)求內(nèi)容就能獲取request和session
// 接收到請(qǐng)求,記錄請(qǐng)求內(nèi)容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
4.在controller的方法上增加自定義注解.
因?yàn)長(zhǎng)og類(lèi)里屬性是value(),所以注解里不用寫(xiě)@Log(value="日志內(nèi)容")
@Log("日志內(nèi)容")
@GetMapping("/list")
public String list() {
return "console/user/list";
}