使用Spring AOP記錄訪問日誌
阿新 • • 發佈:2018-11-01
API: Class clazz = joinPoint.getTarget().getClass(); //獲取目標類物件 String methodName = joinPoint.getSignature().getName(); //獲取切入點的方法名 RequestMapping anno = clazz/method.getAnnotation(RequestMapping.class); //獲取註解物件 String[] values = anno.Value(); //獲取註解的value屬性值 SecurityContext securityContext = SecurityContextHolder.getContext(); User user = (User)securityContext.getAuthentication().getPrincipal(); //User是spring提供的
LogAop:
private Date visitTime; //訪問時間 private Class clazz; //當前正在訪問的class物件 private Method method; //當前正在訪問的method物件 @Autowired private ISysLogService sysLogServiceImpl; //service層物件,用於將訪問日誌儲存到資料庫 @Autowired //在web.xml中配置一個RequestContextListener監聽器,由spring容器來注入資料 private HttpServletRequest request; //前置通知 @Before("pc()") public void doBeforeAdvice(JoinPoint jp) throws NoSuchMethodException { visitTime = new Date(); clazz = jp.getTarget().getClass(); System.out.println(clazz); String methodName = jp.getSignature().getName(); Object[] args = jp.getArgs(); if (args == null) { method = clazz.getDeclaredMethod(methodName); } else { Class[] classes = new Class[args.length]; for (int i = 0; i < classes.length; i++) { classes[i] = args[i].getClass(); } method = clazz.getDeclaredMethod(methodName, classes); } }
//最終通知 @After("pc()") public void doAfterAdvice() { Long executionTime = new Date().getTime() - visitTime.getTime(); RequestMapping classAnno = (RequestMapping) clazz.getAnnotation(RequestMapping.class); String url = null; if (clazz != null && method != null && LogAopTwo.class != clazz) { if (classAnno != null) { String[] classValues = classAnno.value(); if (classValues != null && classValues.length > 0) { //獲取一級目錄 String classUrl = classValues[0]; url += classUrl; RequestMapping methodAnno = (RequestMapping) method.getAnnotation(RequestMapping.class); if (methodAnno != null) { String[] methodValues = methodAnno.value(); if (methodValues != null && methodValues.length > 0) { //獲取二級目錄 String methodUrl = methodValues[0]; //獲得請求URL url += methodUrl; //獲得客戶機IP地址 String ip = request.getRemoteAddr(); //獲取username SecurityContext securityContext = SecurityContextHolder.getContext(); User user = (User) securityContext.getAuthentication().getPrincipal(); String username = user.getUsername(); //封裝SysLog SysLog sysLog = new SysLog(); sysLog.setUsername(username); sysLog.setUrl(url); sysLog.setIp(ip); sysLog.setExecutionTime(executionTime); sysLog.setVisitTime(visitTime); sysLog.setMethod("[class:] " + clazz.getName() + " [method:] " + method.getName()); sysLogServiceImpl.save(sysLog); } } } } } }
SysLog實體類:
private String id;
private Date visitTime;
private String visitTimeStr;
private String username;
private String ip;
private String url;
private Long executionTime;
private String method;