AOP日志-后置通知
生活随笔
收集整理的這篇文章主要介紹了
AOP日志-后置通知
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
創建切面類處理日志
@Component @Aspect public class LogAop {@Autowiredprivate HttpServletRequest request;@Autowiredprivate ISysLogService sysLogService;private Date startTime; // 訪問時間private Class executionClass;// 訪問的類 private Method executionMethod; // 訪問的方法 // 主要獲取日志中其它信息,時長、ip、url...@After("execution(* com.learn.ssm.controller.*.*(..))")public void doAfter(JoinPoint jp) throws Exception {// 獲取類上的@RequestMapping對象if (executionClass != SysLogController.class) {RequestMapping classAnnotation = (RequestMapping)executionClass.getAnnotation(RequestMapping.class);if (classAnnotation != null) {// 獲取方法上的@RequestMapping對象RequestMapping methodAnnotation =executionMethod.getAnnotation(RequestMapping.class);if (methodAnnotation != null) {String url = ""; // 它的值應該是類上的@RequestMapping的value+方法上的@RequestMapping的valueurl = classAnnotation.value()[0] + methodAnnotation.value()[0];SysLog sysLog = new SysLog();// 獲取訪問時長Long executionTime = new Date().getTime() - startTime.getTime();// 將sysLog對象屬性封裝sysLog.setExecutionTime(executionTime);sysLog.setUrl(url);// 獲取ipString ip = request.getRemoteAddr();sysLog.setIp(ip);// 可以通過securityContext獲取,也可以從request.getSession中獲取SecurityContext context = SecurityContextHolder.getContext(); //request.getSession().getAttribute("SPRING_SECURITY_CONTEXT")String username = ((User)(context.getAuthentication().getPrincipal())).getUsername();sysLog.setUsername(username);sysLog.setMethod("[類名]" + executionClass.getName() + "[方法名]" +executionMethod.getName());sysLog.setVisitTime(startTime);// 調用Service,調用dao將sysLog insert數據庫sysLogService.save(sysLog);}}}} }在切面類中我們需要獲取登錄用戶的username,還需要獲取ip地址,我們怎么處理?
username獲取
SecurityContextHolder獲取
ip地址獲取
ip地址的獲取我們可以通過request.getRemoteAddr()方法獲取到。
在Spring中可以通過RequestContextListener來獲取request或session對象。
總結
以上是生活随笔為你收集整理的AOP日志-后置通知的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AOP日志-前置通知操作
- 下一篇: AOP日志-查询日志流程分析