176142998

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

          1、主要實現(xiàn)用戶在進(jìn)行某項操作時,多數(shù)據(jù)庫的更新、插入和刪除詳細(xì)信息。記錄操作時的請求信息。
          2、在進(jìn)入Controller時,生成一個事物ID,在這個Controller中進(jìn)行的所有DAO操作都綁定該事物ID。并進(jìn)行記錄日志信息。


          package com.centralsoft.filter;

          import java.lang.reflect.Field;
          import java.lang.reflect.Method;
          import java.util.Date;
          import java.util.HashMap;
          import java.util.regex.Pattern;

          import net.sf.json.JSONObject;

          import org.aspectj.lang.ProceedingJoinPoint;
          import org.aspectj.lang.annotation.Around;
          import org.aspectj.lang.annotation.Aspect;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.beans.factory.annotation.Qualifier;
          import org.springframework.stereotype.Component;

          import com.centralsoft.cache.CacheService;
          import com.centralsoft.cache.annotations.Cache;
          import com.centralsoft.cache.entity.MemCacheKey;
          import com.centralsoft.entity.SysLogDetail;
          import com.centralsoft.manager.pub.ThreadBean;
          import com.centralsoft.manager.pub.ThreadId;
          import com.centralsoft.pub.dao.SysLogDAO;
          import com.centralsoft.webservice.pub.DateSHA;

          /**
           * DAO層AOP攔截器,實現(xiàn)記錄用戶操作過的所有方法和參數(shù),并實現(xiàn)DAO層緩存
           *
           * @author Administrator
           *
           */
          @Aspect
          @Component
          public class AspectAutoDAOBean {

           @Autowired
           @Qualifier("CacheService")
           private CacheService memcache;

           @Autowired
           @Qualifier("SysLogDAO")
           private SysLogDAO SysLogDAO;

           @Around("execution(* com.centralsoft.*.dao.Zr*DAO.*(..))")
           public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
            // 獲取請求事務(wù)ID信息
            ThreadId threadId = new ThreadBean().getThreadId();
            // 調(diào)用方法名稱
            String methodName = joinPoint.getSignature().getName();
            // 調(diào)用參數(shù)
            Object[] args = joinPoint.getArgs();
            Object object = null;

            // 數(shù)據(jù)庫更新操作日志
            if (Pattern.matches("(save|insert|add|delete|remove|del|update)[\\S]*",
              methodName)) {
             if (threadId != null && threadId.getTransactionalId() != null) {
              // 獲取執(zhí)行請求事務(wù)ID
              String transactionalId = threadId.getTransactionalId();
              // 獲取執(zhí)行請求用戶ID
              String userId = threadId.getUserId();
              SysLogDetail sysLogDetail = new SysLogDetail();
              sysLogDetail.setXh(transactionalId);
              sysLogDetail.setUserId(userId);
              sysLogDetail.setMethod(methodName);
              JSONObject msg = new JSONObject();
              // 處理參數(shù)
              for (Object temp : args) {
               // 獲取參數(shù)類型,不同參數(shù)類型數(shù)據(jù)處理不一樣
               Class<? extends Object> paramClazz = temp.getClass();
               String classType = paramClazz.getName();
               if (classType.equals("java.lang.String")) {
                msg.put("key", temp);
               } else if (classType.equals("java.util.HashMap")) {
                msg.putAll((HashMap<?, ?>) temp);
               } else if (classType.startsWith("com.")) {
                try {
                 Field[] f = paramClazz.getDeclaredFields();
                 for (Field field : f) {
                  String fieldName = field.getName();
                  field.setAccessible(true);
                  msg.put(fieldName, field.get(temp));
                 }
                } catch (SecurityException e) {
                 e.printStackTrace();
                } catch (IllegalArgumentException e) {
                 e.printStackTrace();
                }
               }
              }
              sysLogDetail.setMsg(msg.toString());
              // 記錄DAO數(shù)據(jù)庫操作日志
              SysLogDAO.insertSysLogDetail(sysLogDetail);
             }
             // 執(zhí)行數(shù)據(jù)庫操作
             object = joinPoint.proceed();

             // 數(shù)據(jù)庫查詢緩存
            } else if (Pattern.matches("(query|load|get|select|read)[\\S]*",
              methodName)) {
             // DAO層緩存注解
             MemCacheKey cacheKey = new MemCacheKey();
             // 獲取cache注解屬性
             Cache cache = null;
             // 獲取請求方法
             Class<?> cls = joinPoint.getTarget().getClass();
             // 獲取class中的所有方法
             Method[] methods = cls.getMethods();
             for (Method m : methods) {
              // 獲取執(zhí)行方法前的注解信息。
              if (m.getName().equals(methodName)) {
               cache = m.getAnnotation(Cache.class);
               break;
              }
             }

             if (cache != null) {
              // 獲取memcacheKey,并進(jìn)行MD5加密
              cacheKey = memcacheKey(cache, args);
              // 判斷緩存服務(wù)器是否存在該可以值
              if (memcache.exist(cacheKey.getMemcacheKey())) {
               object = memcache.get(cacheKey.getMemcacheKey());
              } else {
               // 執(zhí)行數(shù)據(jù)庫操作
               object = joinPoint.proceed();
               // 將數(shù)據(jù)存放進(jìn)緩存
               if (cacheKey.getMemcacheKey() != null) {
                memcache.put(cacheKey.getMemcacheKey(),
                  object == null ? "" : object, new Date(cacheKey
                    .getTime()));
               }
              }
             } else {
              // 執(zhí)行數(shù)據(jù)庫操作
              object = joinPoint.proceed();
             }
            } else {
             // 執(zhí)行數(shù)據(jù)庫操作
             object = joinPoint.proceed();
            }

            return object;

           }

           /**
            * 獲取根據(jù)注解中的key獲取memcache的含參數(shù)key值
            *
            * @param cache
            * @param parameterObject
            * @return
            * @author fei.zhao 2011-10-10
            */
           @SuppressWarnings("unchecked")
           private static MemCacheKey memcacheKey(Cache cache, Object[] args) {
            MemCacheKey tempKey = new MemCacheKey();
            String key = "";
            boolean flag = true;
            StringBuilder keyBuilder = new StringBuilder(32);
            // 獲取注解中的key值
            String cacheKey = cache.key();
            Object[] cacheArgs = cacheKey.split("\\.");

            // 設(shè)置請求參數(shù)在args[]中的序號
            // key參數(shù)進(jìn)行循環(huán)遍歷
            for (Object s : cacheArgs) {
             // 判斷是否是格式$,$...
             if (s.toString().startsWith("$")) {
              // 獲取參數(shù)名稱
              String type = s.toString().substring(1);
              // 獲取參數(shù)值
              Object temp = args[0];
              // 獲取參數(shù)類型,不同參數(shù)類型數(shù)據(jù)處理不一樣
              Class<? extends Object> paramClazz = temp.getClass();
              String classType = paramClazz.getName();
              if (classType.equals("java.lang.String")) {
               keyBuilder.append(temp);
              } else if (classType.equals("java.util.HashMap")) {
               keyBuilder.append(((HashMap) temp).get(type));
              } else if (classType.startsWith("com.")) {
               try {
                Field f = paramClazz.getDeclaredField(type);// 實體中字段
                f.setAccessible(true);// 允許訪問私有字段
                keyBuilder.append(f.get(temp));
               } catch (SecurityException e) {
                flag = false;
                e.printStackTrace();
               } catch (NoSuchFieldException e) {
                flag = false;
                e.printStackTrace();
               } catch (IllegalArgumentException e) {
                flag = false;
                e.printStackTrace();
               } catch (IllegalAccessException e) {
                flag = false;
                e.printStackTrace();
               }
              }
             } else {
              keyBuilder.append(s);
             }
             // 每個參數(shù)后面添加 “.”號分隔
             keyBuilder.append(".");
            }
            if (args.length == 3) {
             keyBuilder.append(args[1] + ".").append(args[2]);
            }
            if (flag == true) {
             key = keyBuilder.toString();
             tempKey.setMemcacheKey(DateSHA.shaEncrypt(key));
             tempKey.setTime(cache.time());
            }
            return tempKey;
           }
          }

          posted on 2011-11-07 19:48 飛飛 閱讀(7752) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 仲巴县| 句容市| 景东| 洞头县| 安平县| 宜昌市| 保山市| 灵丘县| 柳河县| 乌海市| 永济市| 孟津县| 抚松县| 柞水县| 红安县| 游戏| 汨罗市| 临沭县| 陵水| 金寨县| 吴旗县| 濉溪县| 岳普湖县| 荣成市| 保定市| 东海县| 靖西县| 台中县| 房产| 阿拉善左旗| 赣榆县| 萍乡市| 齐河县| 南安市| 嘉禾县| 淮南市| 怀柔区| 尖扎县| 商南县| 石棉县| 许昌市|