springmvc集成aop記錄操做日誌

首先說明一下,這篇文章只作了記錄日誌相關事宜html

具體springmvc如何集成配置aop對cotroller進行攔截,請看做者的另外一篇文章java

http://www.cnblogs.com/guokai870510826/p/5977948.htmlweb

好了,回到正題spring

一、在攔截以前,咱們須要額外的自定義一個註解數據庫

代碼以下apache

package com.um.framework.baseware.webadmin.modules.controller.core;
import java.lang.annotation.*;
@Target({ElementType.PARAMETER, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented 
public @interface SystemLog {
    String module()  default "";  
    String methods()  default ""; 
}

二、aop的實現類中處理記錄日誌的邏輯mvc

package com.um.framework.baseware.webadmin.modules.controller.core;

import java.lang.reflect.Method;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.um.framework.baseware.common.util.GetLocalIp;
import com.um.framework.baseware.webadmin.modules.impl.manager.log.LogServiceImpl;
import com.um.framework.baseware.webadmin.modules.services.manager.log.entity.LogEntity;

@Aspect
public class LogAopAction {
    //注入service,用來將日誌信息保存在數據庫
    @Resource(name="logService")
    private LogServiceImpl logservice;
    
     //配置接入點,若是不知道怎麼配置,能夠百度一下規則
     @Pointcut("execution(* com.um.framework.baseware.webadmin.modules.controller..*.*(..))")  
     private void controllerAspect(){}//定義一個切入點
 
     @Around("controllerAspect()")
     public Object around(ProceedingJoinPoint pjp) throws Throwable {
         //常見日誌實體對象
         LogEntity log = new LogEntity(); 
         //獲取登陸用戶帳戶
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         String name = (String) request.getSession().getAttribute("USER_ID");
         log.setUSERID(name);
         //獲取系統時間
         String time = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());
         log.setDATA(time);
         
         //獲取系統ip,這裏用的是我本身的工具類,可自行網上查詢獲取ip方法
         String ip = GetLocalIp.localIp();
         log.setIP(ip);
         
        //方法通知前獲取時間,爲何要記錄這個時間呢?固然是用來計算模塊執行時間的
         long start = System.currentTimeMillis();
        // 攔截的實體類,就是當前正在執行的controller
        Object target = pjp.getTarget();
        // 攔截的方法名稱。當前正在執行的方法
        String methodName = pjp.getSignature().getName();
        // 攔截的方法參數
        Object[] args = pjp.getArgs();
        // 攔截的放參數類型
        Signature sig = pjp.getSignature();
        MethodSignature msig = null;
        if (!(sig instanceof MethodSignature)) {
            throw new IllegalArgumentException("該註解只能用於方法");
        }
        msig = (MethodSignature) sig;
        Class[] parameterTypes = msig.getMethod().getParameterTypes();
        
        Object object = null;
        // 得到被攔截的方法
        Method method = null;
        try {
            method = target.getClass().getMethod(methodName, parameterTypes);
        } catch (NoSuchMethodException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (SecurityException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        if (null != method) {
            // 判斷是否包含自定義的註解,說明一下這裏的SystemLog就是我本身自定義的註解
            if (method.isAnnotationPresent(SystemLog.class)) {
                SystemLog systemlog = method.getAnnotation(SystemLog.class);
                log.setMODULE(systemlog.module());
                log.setMETHOD(systemlog.methods());
                try {
                    object = pjp.proceed();
                    long end = System.currentTimeMillis();
                    //將計算好的時間保存在實體中
                    log.setRSPONSE_DATA(""+(end-start));
                    log.setCOMMITE("執行成功!");
                    //保存進數據庫
                    logservice.saveLog(log);
                } catch (Throwable e) {
                    // TODO Auto-generated catch block
                    long end = System.currentTimeMillis();
                    log.setRSPONSE_DATA(""+(end-start));
                    log.setCOMMITE("執行失敗");
                    logservice.saveLog(log);
                }
            } else {//沒有包含註解
                object = pjp.proceed();
            }
        } else { //不須要攔截直接執行
            object = pjp.proceed();
        }
        return object;
     }
}

而後整個業務就處理完了工具

三、看一下怎麼使用spa

在controller中使用註解.net

四、日誌的實體對象屬性

數據庫表就不用說了吧,和實體字段對應起來就ok了

看一下數據庫表中記錄的數據

至此,aop處理日誌就處理完了

相關文章
相關標籤/搜索