亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Spring MVC AOP通過注解方式攔截Controller等實現日志管理

2019-11-11 03:46:40
字體:
來源:轉載
供稿:網友

問題介紹

       最近在做微信企業號的Saas套件開發,因而前端頁面都是使用H5做的。為了提高開發效率,使得前后端基本能夠并行開發,我們后端開發人員和前端開發人員就約定使用前后端分離的開發方式。

  

      一旦采用前后端分離的開發方式,我們后端人員就只提供接口了。因為我們是采用sPRing + springmvc_mybatis的通用架構。所以這種純接口的開發非常方便。

 

      但是在開發調試過程中遇到一個痛點就是在測試環境中一旦遇到錯誤比較難定位問題,因為微信中的調試器打開比較麻煩,所以要看一個問題需要耗費比較長的時間(相信使用微信工具調試的人深知此事)。所以一般情況下,后端開發人員都在日志中打印前端傳給后端的請求參數以及返回給前端的結果。因而代碼中充斥著這樣的邏輯。

     

	/**	 * xxxx	 * 	 * @param queryVo	 * @return	 */	@RequestMapping(value = "/xxxx")	@ResponseBody	public Map<String, Object> xxxx(OrderStatisticsQueryParams queryParams)	{		logger.debug("請求參數:" + JsonUtil.toJSONString(queryParams));		// PROCESS result		return result;	}

  

      如果只是一個兩個接口也就罷了,但是之后我們打算都采用前后端分離的方式來開發,因而代碼中必定到處都充斥著這樣的重復邏輯。

  

      因為我想到了可以使用AOP來解決這個問題。

      

問題解決方案

       1.使用自定義注解來標識哪些接口需要打印參數日志,而不是一刀切,所有的接口都需要打印日志

     2.考慮線上的情況。一般來講打印日志的需求只會在開發測試階段才會有,而正常情況下線上不需要打印請求參數。而且打印參數也會浪費線上的資源。

 

     二話不說,先上自定義日志注解的代碼

    

@Retention(RetentionPolicy.RUNTIME)@Target({	ElementType.METHOD})public @interface SystemLog{	String description() default "";  // 方法描述}

       再上切面的代碼

package com.zk.platform.aop;import java.lang.reflect.Method;import java.util.Map;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import com.alibaba.fastjson.JSON;import com.google.common.collect.Maps;import com.zk.platform.annotation.SystemLog;import com.zk.platform.util.PropertiesUtil;@Aspect@Componentpublic class SystemLogAop{	private static final boolean ENABLE_METHOD_LOGGING = "true".equals(PropertiesUtil.getSysProp("method.args.logging",			"false"));	private static final Logger logger = LoggerFactory.getLogger(SystemLogAop.class);	@Pointcut("@annotation(com.zk.platform.annotation.SystemLog)")	public void systemLogPointCut()	{	}	@Before("systemLogPointCut()")	public void beforeExec(JoinPoint joinPoint)	{		// 不開啟的話則不打印日志		if (!ENABLE_METHOD_LOGGING)		{			return;		}		try		{			String targetName = joinPoint.getTarget().getClass().getSimpleName();			String methodName = joinPoint.getSignature().getName();			MethodSignature ms = (MethodSignature) joinPoint.getSignature();			Object[] arguments = joinPoint.getArgs();			String[] parameterNames = ms.getParameterNames();			Method method = ms.getMethod();			SystemLog systemLog = method.getAnnotation(SystemLog.class);			if (arguments != null && parameterNames != null && arguments.length == parameterNames.length					&& arguments.length > 0)			{				Object argObj = null;				if (arguments.length == 1)				{					argObj = arguments[0];				}				else				{					Map<String, Object> map = Maps.newHashMapWithExpectedSize(arguments.length);					for (int i = 0; i < arguments.length; i++)					{						map.put(parameterNames[i], arguments[i]);					}					argObj = map;				}				logger.debug("{}.{}({}) args are:{}", targetName, methodName, systemLog.description(),						JSON.toJSONString(argObj));			}			else			{				logger.debug("{}.{}({}) invoked and no args", targetName, methodName, systemLog.description());			}		}		catch (Exception e)		{			logger.warn("打印日志異常:{}", e);		}	}	@AfterReturning(pointcut = "systemLogPointCut()", returning = "result")	public void afterReturning(JoinPoint joinPoint, Object result)	{		// 不開啟的話則不打印日志		if (!ENABLE_METHOD_LOGGING)		{			return;		}		try		{			String targetName = joinPoint.getTarget().getClass().getSimpleName();			String methodName = joinPoint.getSignature().getName();			MethodSignature ms = (MethodSignature) joinPoint.getSignature();			Method method = ms.getMethod();			SystemLog systemLog = method.getAnnotation(SystemLog.class);			logger.debug("{}.{}({}) return value is:{}", targetName, methodName, systemLog.description(),					JSON.toJSONString(result));		}		catch (Exception e)		{			logger.warn("打印日志異常:{}", e);		}	}} 

      注意,日志功能是否生效由參數"method.args.logging來控制,保證線上不受影響。

       

問題解決過程中遇到的問題

     配置后,發現切面沒有生效。

    解決方案如下  

    <!-- 最重要:::如果放在spring-context.xml中,這里的aop設置將不會生效 -->    <aop:aspectj-autoproxy proxy-target-class="true"/>   

   在spring配置文件中加上這句

    <aop:aspectj-autoproxy proxy-target-class="true"/>

     

 

  

   

    

 

  

    


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人精品一区二区三区| 国产日韩欧美黄色| 亚洲欧美变态国产另类| 国产精品视频久久久| 久久国产精品久久久| 色综合五月天导航| 欧美国产激情18| 蜜月aⅴ免费一区二区三区| 韩曰欧美视频免费观看| 日韩中文字幕视频| 91理论片午午论夜理片久久| 久久男人的天堂| 欧美一级黑人aaaaaaa做受| 最近2019年中文视频免费在线观看| 亚洲国产精品va在线看黑人| 国产一区二区色| 欧美日韩亚洲视频一区| 尤物精品国产第一福利三区| 欧美一级淫片videoshd| 久久久久久国产| 91老司机在线| 久久久精品久久久久| 亚洲激情电影中文字幕| 欧美中文字幕视频在线观看| 日韩精品电影网| 精品久久久久久久久中文字幕| 亚洲美女动态图120秒| 久久精品视频中文字幕| 国产精品视频免费在线观看| 亚洲欧美精品一区二区| 国产精品色午夜在线观看| 国产日韩欧美在线| 欧美极品少妇全裸体| 亚洲护士老师的毛茸茸最新章节| 91精品在线播放| 91中文字幕一区| 日韩成人av一区| 国产精品小说在线| 国产精品久久久久久久久免费看| 亚洲精品成人免费| 狠狠躁18三区二区一区| 日韩精品极品视频免费观看| 欧美激情啊啊啊| 欧美激情一区二区三区高清视频| 欧美在线视频一区| 青青草精品毛片| 国产日韩中文字幕在线| 亚洲人成毛片在线播放| 亚洲自拍偷拍福利| 欧美性受xxxx白人性爽| 欧美精品在线极品| 最近2019免费中文字幕视频三| 日韩电影大全免费观看2023年上| 欧美成人午夜剧场免费观看| 久久久在线免费观看| 亚洲欧美激情精品一区二区| 久久夜精品va视频免费观看| www.日本久久久久com.| 久久露脸国产精品| 欧美黑人一区二区三区| 成人做爰www免费看视频网站| 一区二区欧美亚洲| 国产精品久久国产精品99gif| 最新亚洲国产精品| 97视频在线观看播放| 国内精久久久久久久久久人| 欧美性xxxx在线播放| 亚洲欧美成人网| 成人免费直播live| 欧美黑人国产人伦爽爽爽| 97国产在线视频| 精品欧美aⅴ在线网站| 日韩性生活视频| 青青久久av北条麻妃海外网| 精品国产乱码久久久久久天美| www高清在线视频日韩欧美| 91精品久久久久久久久久另类| 日韩视频中文字幕| 日韩在线高清视频| 国产精品第10页| 日韩精品免费在线| 国产精品专区第二| 欧美精品在线免费观看| 亚洲欧美综合图区| 91av视频在线播放| 国产精品一二三视频| 中文字幕精品av| 国产亚洲欧美视频| 亚洲黄一区二区| 亚洲а∨天堂久久精品9966| 国产精品日韩欧美综合| 91久久久在线| 免费不卡欧美自拍视频| 国产精品无码专区在线观看| 欧美福利小视频| 国产欧美 在线欧美| 狠狠躁天天躁日日躁欧美| 久久在线免费视频| 成人激情春色网| 欧美日本啪啪无遮挡网站| 国产精品jvid在线观看蜜臀| 国产精品黄色av| 国产欧美一区二区三区在线| 精品成人国产在线观看男人呻吟| 91精品国产综合久久男男| 国产精品久久久久久av| 国产97在线亚洲| 91在线观看免费观看| 欧美插天视频在线播放| 精品久久久久久中文字幕一区奶水| 中文字幕日韩电影| 在线色欧美三级视频| 日本一区二区三区在线播放| 亚洲精品一区中文字幕乱码| 国产成人精品免高潮在线观看| 久久6免费高清热精品| 欧美在线视频网站| 中文字幕精品一区二区精品| 欧美日韩在线影院| 91在线观看欧美日韩| 欧美大片在线看| 中文字幕久久久av一区| 久久九九免费视频| 亚洲最大的网站| 最近的2019中文字幕免费一页| 国产精品扒开腿做| www欧美xxxx| 国产精品女人久久久久久| 午夜精品久久久久久久久久久久| 亚洲尤物视频网| 青草青草久热精品视频在线网站| 日韩精品免费在线视频| 久久久精品日本| 国产精品视频大全| 久久97精品久久久久久久不卡| 红桃视频成人在线观看| 一本色道久久综合狠狠躁篇的优点| 日韩在线观看视频免费| 欧美老女人性视频| 欧美激情第三页| 97精品国产97久久久久久免费| 日韩中文在线中文网在线观看| 久久影院免费观看| 欧美重口另类videos人妖| 精品动漫一区二区| 91精品中文在线| 精品色蜜蜜精品视频在线观看| 精品国产精品自拍| 欧美激情区在线播放| 日韩成人在线观看| 日韩av高清不卡| 欧美国产精品va在线观看| 欧美精品国产精品日韩精品| 国模视频一区二区| 欧美美女操人视频| 久久久久久中文| 欧美高清视频免费观看| 精品视频在线播放免| 精品亚洲一区二区三区在线播放| 91香蕉亚洲精品| 国产在线精品一区免费香蕉| 亚洲国产一区二区三区四区| 欧美一级高清免费播放| 成人福利网站在线观看|