iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >springAOP实现@Around输出请求参数和返回参数
  • 752
分享到

springAOP实现@Around输出请求参数和返回参数

2024-04-02 19:04:59 752人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录@Around输出请求参数和返回参数先把我的打印日志代码贴出来测试spring aop中Around切面处理参数解决的办法具体的代码@Around输出请求参数和返回参数 spri

@Around输出请求参数和返回参数

spring 的AOP是通过cglib动态代理和jdk的动态代理实现的。

先把我的打印日志代码贴出来

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);
    //创建Pointcut表示式,表示所有controller请求
	@Pointcut("execution(* com..*.controller..*(..))")
	private void controllerAspect() {
	}// 请求method前打印内容
	@Around(value = "controllerAspect()")
	public void around(ProceedingJoinPoint pjp) throws Throwable {
	//通过uuid关联请求参数和返回参数
		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切面处理参数

最近遇到一个场景,在业务流程处理中,很多的方法都需要对传入的参数对象做公共的处理【比如:添加编辑人信息】,而且这些传入对象都继承自一个父类,同时需要用到HttpServletRequest。

解决的办法

使用自定义annotation+aop来实现预处理 具体的处理流程是

1、自定义一个annotation用于标记需要处理的地方

2、创建切面类,在pointcut时对annotation进行拦截,在@Around环绕通知里面获取@annotation对应的当前对象,获取当前对象参数,并修改参数内容,然后proceed一下,继续执行

具体的代码

@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);
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: springAOP实现@Around输出请求参数和返回参数

本文链接: https://www.lsjlt.com/news/139373.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springAOP实现@Around输出请求参数和返回参数
    目录@Around输出请求参数和返回参数先把我的打印日志代码贴出来测试spring AOP中Around切面处理参数解决的办法具体的代码@Around输出请求参数和返回参数 spri...
    99+
    2024-04-02
  • SpringAOP如何修改请求参数列表
    目录SpringAOP修改请求参数列表SpringAOP获取参数名参数值总结SpringAOP修改请求参数列表 如题,今天遇到了一个问题,要批量在前端请求之后修改其中的一个参数值。 ...
    99+
    2023-03-07
    SpringAOP请求参数 SpringAOP参数 SpringAOP请求参数列表
  • SpringAOP怎么修改请求参数列表
    这篇“SpringAOP怎么修改请求参数列表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringAOP怎么修改请求参数...
    99+
    2023-07-05
  • java接口返回参数按照请求参数进行排序方式
    目录java接口返回参数按照请求参数进行排序排序java通过接口进行排序描述知识点1.Comparable接口2.Comparator接口java接口返回参数按照请求参数进行排序 在...
    99+
    2024-04-02
  • MySQL存储过程输入参数,输出参数和输入输出参数是什么
    这篇“MySQL存储过程输入参数,输出参数和输入输出参数是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL存储过...
    99+
    2023-07-02
  • C++ 函数的参数和返回值
    函数在 c++++ 中通过参数传递数据并通过返回值返回信息:参数:函数定义中声明,允许函数接收外部值。返回值:函数定义中声明,使函数能够将信息返回给调用代码。 C++ 函数的参数和返回...
    99+
    2024-04-12
    参数 函数 c++
  • Java实现post请求(带有参数)
    package Sort.pay;import net.sf.json.JSONObject;import org.apache.commons.codec.digest.DigestUtils;import java.io.Buffere...
    99+
    2023-09-26
    maven Powered by 金山文档
  • PHP 函数的参数和返回值
    php 函数的参数可以具有类型说明和默认值,而返回值可以返回一个类型说明的值。例如,一个计算两个数字和并返回整数的函数 sum(),它接受两个整数参数,其中一个有默认值 "guest"。...
    99+
    2024-04-13
    参数 php 返回值
  • golang数组和切片作为参数和返回值的实现
    目录1. 数组作为参数和返回值时1.1数组的定义1.2数组作为参数和返回值的时候2.切片作为参数和返回值2.1 切片的定义初始化2.2 切片的存储大致分为3部分2.3 切片作为参数和...
    99+
    2024-04-02
  • Spring Boot怎么实现请求参数校验
    这篇文章主要介绍了Spring Boot怎么实现请求参数校验的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Boot怎么实现请求参数校验文章都会有所收获,下面我们一...
    99+
    2024-04-02
  • SpringBoot中怎么实现请求参数校验
    在Spring Boot中,可以使用JSR 303规范中的注解来实现请求参数的校验。具体步骤如下: 在Controller类中的请...
    99+
    2024-03-08
    SpringBoot
  • spring boot实现在request里解密参数返回
    目录spring boot在request里解密参数返回前言代码块最后Spring boot配置Aop获取controller里的request中的参数及其返回值首先在你的Maven...
    99+
    2024-04-02
  • java中有没有参数和返回值
    这篇文章给大家分享的是有关java中有没有参数和返回值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java有无参数和返回值首先,定义一个土豪类(LocalTyrant)属性:name moeney smoke行...
    99+
    2023-06-29
  • SpringMVC实现获取请求参数方法详解
    目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@RequestHeader5、@CookieValue6、通过POJO获取...
    99+
    2024-04-02
  • RestTemplate Get请求如何实现bean参数传递
    今天小编给大家分享一下RestTemplate Get请求如何实现bean参数传递的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2023-07-04
  • SpringMVC获取请求参数实现方法介绍
    目录一、通过ServletAPI获取二、通过控制器方法的形参获取请求参数三、@RequestParam四、@RequestHeader五、@CookieValue六、通过POJO获取...
    99+
    2022-11-13
    SpringMVC获取请求参数 SpringMVC请求参数
  • C#怎么实现按输出传递参数
    这篇文章主要讲解了“C#怎么实现按输出传递参数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现按输出传递参数”吧!按输出传递参数return 语句可用于只从函数中返回一个值。但是,...
    99+
    2023-06-17
  • Spring MVC实现GET请求接收Date类型参数
    目录SpringMVC GET请求接收Date类型参数Controller方法定义SpringMVC接收哪些类型参数参数支持的数据类型使用要求自定义类型转换器使用 ServletAP...
    99+
    2024-04-02
  • POST请求和GET请求怎么传递和接收解析参数
    本篇内容介绍了“POST请求和GET请求怎么传递和接收解析参数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • 学习Go语言函数的参数和返回值
    学习Go语言函数的参数和返回值 在Go语言中,函数是一种重要的编程元素,它用于封装一组操作以及数据处理逻辑。函数的参数和返回值是函数的重要组成部分,通过合理的设计参数和返回值,可以使函...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作