AOP印刷要求情報

项目中使用AOP打印请求信息、打印响应信息。
パッケージcom.example.aspect。

輸入com.alibaba.fastjson.JSON;
輸入com.google.gson.Gson;
輸入com.example.util.DateUtil;
輸入org.apache.commons.lang.ArrayUtils。
輸入org.aspectj.lang.JoinPoint;
輸入org.aspectj.lang.annotation *。;
輸入org.slf4j.Logger;
輸入org.slf4j.LoggerFactory。
輸入org.springframework.stereotype.Component;
輸入org.springframework.web.context.request.RequestContextHolder。
輸入org.springframework.web.context.request.ServletRequestAttributes。

インポートのjavax.servlet.http.HttpServletRequest;
インポートのjavax.servlet.http.HttpServletResponse;
輸入java.util.Arrays。
輸入はjava.util.List;
java.util.stream.Collectorsインポート、
インポートjava.util.stream.Stream;


/ **
* @author mingtian
* @desctiption:機能の説明:AOPカット印刷ログ
* @data 2019年12月22日
* @version:VL
* /
@Aspect
@Component
パブリッククラスHttpAspect {

保護ロガーロガー= LoggerFactory.getLogger(HttpAspect.class);

プライベートGson GSON新しい新しいGson =();

/ **
*プロセスに、パッケージ名+クラス名+メソッド名
* /
@Pointcut( "実行(com.example.web.controller .. *。*(..))")
公共ボイドカット(){
}


/ **
*事前通知方法
*
* @paramジョインポイント
* /
@ ( "カット()")の前に
公共のボイドdoBefore(ジョインポイントジョインポイント){
//获取类メソッド用于
logger.info(「------------------------ doBefore ----- ----------------------- ");
ServletRequestAttributes属性=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequestのリクエスト= attributes.getRequest()。
//记录下请求内容
StringBufferのRequestInfoを=新しいStringBufferを();
requestInfo.append( "住所:"。+ request.getRequestURL()のtoString()+ "\ n"は);
requestInfo.append( "IP:" + request.getRemoteAddr()+ "\ n"は);
requestInfo.append( "メソッド名:" + joinPoint.getSignature()+ "\ n"は);
オブジェクト[]引数= joinPoint.getArgs()。
//序列化时过滤掉要求和応答
リストの<Object> logArgs = streamOf(引数).filter(引数- !!>((引数のinstanceofのHttpServletRequest)&&(引数のinstanceofのHttpServletResponse)))
.collect(Collectors.toList() );
ストリングargStr = JSON.toJSONString(logArgs)。
requestInfo.append( "RequestParam:" + argStr + "\ n"は);
logger.info(DateUtil.getNowDate()+ "RequestInfoを:\ n" + RequestInfoを)。
}

/ **
*过滤工具类
*
* @paramアレイ
* @param <T>
* @return
* /
パブリック静的<T>ストリーム<T> streamOf(T []配列){
リターンArrayUtils.isEmpty(アレイ)?Stream.empty():配列。
}

/ **
*リア通知
* /
@After( "カット()")
公共ボイドdoAfter(){
logger.info(「-------------------- doAfter ----------------------- -----------「);
}

/ **
*メソッドの実行後にパラメータを返します
*
* @param OBJ
* /
@AfterReturning( "OBJ"を返す=、ポイントカット= "カット()")
公共ボイドdoAfterReturning(オブジェクトobj){
//終了処理要求は、対応するパラメータを返す
(DateUtil.getNowDate(logger.info) + "ResponseResultを" + gson.toJson(OBJ));
}
}
注:
次のようにDateUtil.getNowDate()は、現在時刻取得ツールです。
/ ** 
*形式の日付形式:MM-DD-YYYY HH:MM:SSS SS
* /
パブリック静的文字列getNowDate(){
文字列形式= "MM-DD-YYYY HH:MM:SS SSS";
リターンLocalDateTime.now ().format(DateTimeFormatter.ofPattern(形式));
}

おすすめ

転載: www.cnblogs.com/ming-blogs/p/12079689.html