最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring AOP實現(xiàn)@Around輸出請求參數和返回參數

 更新時間:2022年02月16日 11:13:29   作者:haodong1024  
這篇文章主要介紹了spring AOP實現(xiàn)@Around輸出請求參數和返回參數,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@Around輸出請求參數和返回參數

spring 的AOP是通過cglib動態(tài)代理和jdk的動態(tài)代理實現(xiàn)的。

先把我的打印日志代碼貼出來

package com.zhd.exploit.api.config;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletResponseWrapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.ExtendedServletRequestDataBinder;
import com.alibaba.fastjson.JSONObject;
@Aspect
@Component
@Order(1)
public class ControllerLogInterceptor {
	private static final Logger log = LoggerFactory.getLogger(ControllerLogInterceptor.class);
    //創(chuàng)建Pointcut表示式,表示所有controller請求
	@Pointcut("execution(* com..*.controller..*(..))")
	private void controllerAspect() {
	}// 請求method前打印內容
	@Around(value = "controllerAspect()")
	public void around(ProceedingJoinPoint pjp) throws Throwable {
	//通過uuid關聯(lián)請求參數和返回參數
		String uuid = UUID.randomUUID().toString().replaceAll("-", "");
		methodBefore(pjp, uuid);
		try {
			Object proceed = pjp.proceed();
			methodAfterReturing(proceed, uuid);
		} catch (Exception e) {
			log.error("[{}]Response異常內容:{}", uuid, e);
			throw e;
		}
	}
	public void methodBefore(JoinPoint joinPoint, String uuid) {
		// 打印請求內容
		try {
			// 下面兩個數組中,參數值和參數名的個數和位置是一一對應的。
			Object[] objs = joinPoint.getArgs();
			String[] argNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames(); // 參數名
			Map<String, Object> paramMap = new HashMap<String, Object>();
			for (int i = 0; i < objs.length; i++) {
				if (!(objs[i] instanceof ExtendedServletRequestDataBinder) && !(objs[i] instanceof HttpServletResponseWrapper)) {
					paramMap.put(argNames[i], objs[i]);
				}
			}
			if (paramMap.size() > 0) {
				log.info("\n[{}]方法:{}\n參數:{}", uuid, joinPoint.getSignature(), JSONObject.toJSONString(paramMap));
			}
		} catch (Exception e) {
			log.error("[{}]AOP methodBefore:", uuid, e);
		}
	}
	public void methodAfterReturing(Object o, String uuid) {
		try {
			if (o != null)
				log.info("[{}]Response內容:{}", uuid, JSONObject.toJSON(o));
		} catch (Exception e) {
			log.error("[{}]AOP methodAfterReturing:", uuid, e);
		}
	}
}

測試

請求參數類型1

?? ?@RequestMapping(value = "/test0", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE })
?? ?public Result test0(@RequestParam String name, @RequestParam String password) {
?? ??? ?System.out.println("test0 OK");
?? ??? ?return new Result("1", "mock a Result");
?? ?}

打印日志:

[fe7155a3089b4dd7896b759a933cf958]方法:Result com.zhd.exploit.api.controller.TestController.test0(String,String)
參數:{"password":"123","name":"zhang"}

請求參數類型2

?? ?@RequestMapping(value = "/test1", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE })
?? ?public Result test1(PayDTO payDTO) {
?? ??? ?System.out.println("test1 OK");
?? ??? ?return new Result("1", "mock a Result");
?? ?}

打印日志:

[a2f7d19dea834c54a45b480bd4e8c3cd]方法:Result com.zhd.exploit.api.controller.TestController.test1(PayDTO)
參數:{"payDTO":{"appmount":"10","paytype":"1"}}

請求參數類型3

?? ?@RequestMapping(value = "/test2", method = RequestMethod.POST, produces = { MediaType.APPLICATION_JSON_VALUE })
?? ?public Result test2(@RequestBody PayDTO payDTO) {
?? ??? ?System.out.println("test2 OK");
?? ??? ?return new Result("2", "mock a Result");
?? ?}

打印日志:

[cd6a3d9d05244eee95bbf3c607d038cc]方法:Result com.zhd.exploit.api.controller.TestController.test2(PayDTO)
參數:{"payDTO":{"appmount":"10","paytype":"1"}}

spring AOP中Around切面處理參數

最近遇到一個場景,在業(yè)務流程處理中,很多的方法都需要對傳入的參數對象做公共的處理【比如:添加編輯人信息】,而且這些傳入對象都繼承自一個父類,同時需要用到HttpServletRequest。

解決的辦法

使用自定義annotation+aop來實現(xiàn)預處理 具體的處理流程是

1、自定義一個annotation用于標記需要處理的地方

2、創(chuàng)建切面類,在pointcut時對annotation進行攔截,在@Around環(huán)繞通知里面獲取@annotation對應的當前對象,獲取當前對象參數,并修改參數內容,然后proceed一下,繼續(xù)執(zhí)行

具體的代碼

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Operate {
}
@Aspect
@Component
public class OperateInterceptor {?
? ? @Pointcut("@annotation(com.yili.web.entity.Operate)")
? ? public void interceptor() {
? ? }
?
? ? @Resource
? ? private SqlObjectUtil sqlObjectUtil;
?
? ? @Around(value = "interceptor()")
? ? public Object check(ProceedingJoinPoint pjp) throws Throwable {
? ? ? ? System.out.println("進入interceptor");
? ? ? ? Signature signature = pjp.getSignature();
? ? ? ? if (!(signature instanceof MethodSignature)) {
? ? ? ? ? ? throw new IllegalArgumentException("該注解只適用于方法");
? ? ? ? }
? ? ? ? Object[] objects = pjp.getArgs();
? ? ? ? RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
? ? ? ? ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) attributes;
? ? ? ? HttpServletRequest request = servletRequestAttributes.getRequest();
? ? ? ? String loginToken = getLoginToken(request); ? ? ? ?
? ? ? ? for (int i=0;i<objects.length;i++){
? ? ? ? ? ? if (SqlObject.class.isAssignableFrom(objects[i].getClass()))) {
? ? ? ? ? ? ? ? sqlObjectUtil.setOperatorInfo(loginToken,(SqlObject)objects[i]);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return pjp.proceed(objects);
? ? }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java?中?Class?Path?和?Package的使用詳解

    Java?中?Class?Path?和?Package的使用詳解

    這篇文章主要介紹了Java?中?Class?Path和Package的使用詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • spring帶bean和config如何通過main啟動測試

    spring帶bean和config如何通過main啟動測試

    這篇文章主要介紹了spring帶bean和config,通過main啟動測試,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 關于PreparedStatement的setObject作用及說明

    關于PreparedStatement的setObject作用及說明

    這篇文章主要介紹了關于PreparedStatement的setObject作用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 分析HashMap 的 JDK 源碼

    分析HashMap 的 JDK 源碼

    這篇文章主要分析了HashMap 的 JDK 源碼,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-10-10
  • Maven學習教程之搭建多模塊企業(yè)級項目

    Maven學習教程之搭建多模塊企業(yè)級項目

    本篇文章主要介紹了Maven學習教程之搭建多模塊企業(yè)級項目 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java緩存框架之Caffeine源碼解析

    Java緩存框架之Caffeine源碼解析

    這篇文章主要介紹了Java緩存框架之Caffeine源碼解析,Caffeine?是一個基于Java?8的高性能本地緩存框架,其結構和?Guava?Cache?基本一樣,api也一樣,基本上很容易就能替換,需要的朋友可以參考下
    2023-11-11
  • Java:DocumentBuilderFactory調用XML的方法實例

    Java:DocumentBuilderFactory調用XML的方法實例

    Java:DocumentBuilderFactory調用XML的方法實例,需要的朋友可以參考一下
    2013-04-04
  • 線程池之newCachedThreadPool可緩存線程池的實例

    線程池之newCachedThreadPool可緩存線程池的實例

    這篇文章主要介紹了線程池之newCachedThreadPool可緩存線程池的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java工具類之實現(xiàn)java獲取文件行數

    java工具類之實現(xiàn)java獲取文件行數

    這篇文章主要介紹了一個java工具類,可以取得當前項目中所有java文件總行數,代碼行數,注釋行數,空白行數,需要的朋友可以參考下
    2014-03-03
  • java獲取IP歸屬地全網顯示開源庫使用

    java獲取IP歸屬地全網顯示開源庫使用

    這篇文章主要為大家介紹了java獲取IP歸屬地全網顯示的開源庫使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論

苍山县| 通山县| 荔波县| 怀来县| 天柱县| 扎赉特旗| 台北县| 临沂市| 屏山县| 南通市| 淮阳县| 株洲市| 白朗县| 北川| 姜堰市| 龙海市| 郎溪县| 新安县| 抚顺市| 平和县| 西贡区| 兴义市| 江都市| 黔江区| 湟源县| 咸丰县| 凌源市| 班玛县| 石柱| 漾濞| 汝州市| 曲阜市| 土默特左旗| 招远市| 安阳市| 黑龙江省| 浮山县| 丘北县| 兰坪| 湘潭市| 舟曲县|