spring aop切點記錄日誌到mongodb 註解版
阿新 • • 發佈:2018-12-24
package com.jk.aspectj; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.jk.domain.test.LogBean; import com.jk.utils.SessionUserUtil; @Aspect @Component public class LogAspectj { @Autowired private MongoTemplate mongoTemplate; @Pointcut("execution(* com.jk.service..*.*(..))") public void logPointCut() {} @AfterReturning(value="logPointCut()",argNames = "rtv", returning = "rtv") public void saveLog(JoinPoint joinPoint, Object rtv) throws Exception { // 判斷引數 if (joinPoint.getArgs() == null) {// 沒有引數 return; } LogBean logBean = new LogBean(); //獲取方法請求引數 Object[] os = joinPoint.getArgs(); //獲取類名 String className = joinPoint.getTarget().getClass().getSimpleName(); logBean.setClassName(className); //獲取方法名 String methodName = joinPoint.getSignature().getName(); logBean.setMethodName(methodName); String param = className + "." + methodName + ":"; for (int i = 0; i < os.length; i++) { param += "引數[" + i + "]:" + os[i].toString(); } logBean.setParam(param); logBean.setCreateTime(new Date()); RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) requestAttributes; if(sra != null) { HttpServletRequest request = sra.getRequest(); String userId = SessionUserUtil.getUserId(request); logBean.setUserId(userId); logBean.setIp(getIp(request)); } mongoTemplate.save(logBean); } //獲取客戶端ip public static String getIp(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){ //多次反向代理後會有多個ip值,第一個ip才是真實ip int index = ip.indexOf(","); if(index != -1){ return ip.substring(0,index); }else{ return ip; } } ip = request.getHeader("X-Real-IP"); if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){ return ip; } return request.getRemoteAddr(); } }