1. 程式人生 > >使用Spring AOP記錄訪問日誌

使用Spring AOP記錄訪問日誌

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;