博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Spring AOP修改请求、返回参数
阅读量:6039 次
发布时间:2019-06-20

本文共 1835 字,大约阅读时间需要 6 分钟。

hot3.png

AOP:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

通过使用AOP技术,我们可以在自定义的切面对切点扩展相应的操作,如打印日志,转换参数等。

生产中,为保证数据安全或者减少数据传输量,传递参数时,往往会对参数进行BASE64编码、非对称加密等操作,一般我们会封装一个公共类,需要编解码或加解密参数的时候调用一下,这会造成一定的代码冗余,以上,我们可以采用AOP技术,解放操作。

以对参数进行BASE64编解码为例,我们先定义切面、切点:

/** * @author : niithub * @description : 切面-校验请求参数 * @date : 2018/7/20 */@Aspect@Component@Slf4jpublic class ParamAspect {    private static final ObjectMapper MAPPER = new ObjectMapper();    @Pointcut("execution(public * com..*.*Controller.*(..))")    public void doOperation() {        log.info("参数检验AOP");    }    @Around("doOperation()")    public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable {        Object[] obj = joinPoint.getArgs();        byte[] param = null;        for (Object argItem : obj) {            String convertData;            if (argItem instanceof String) {                param = Base64Utils.decode(String.valueOf(argItem).getBytes());            }            convertData = new String(param);            Map map = MAPPER.readValue(convertData, Map.class);            if(map.get("body") == null) {                throw new ApiRuntimeException(-1, "参数错误");            }            obj[0] = MAPPER.writeValueAsString(map.get("body"));        }        return joinPoint.proceed(obj);    }    @AfterReturning(returning = "object", pointcut = "doOperation()")    public void doAfterReturning(Object object) {        ResponseMessage responseMessage = (ResponseMessage) object;        byte[] a = Base64Utils.encode(String.valueOf(responseMessage.getData()).getBytes());        responseMessage.setMsg(new String(a ));        log.info("请求返回值【{}】", object.toString());    }}

doBefore方法解码请求参数,doAfterReturning方法编码返回参数。

1. 修改请求参数

        请求参数:

5c2bfe345f19c46076b5cf9532dd008dffc.jpg

3cde92f7b7d34702e29661875efba5474f3.jpg

     打印出的请求参数:

212259f1e66bdab43380b2fe3852504c3b4.jpg

2. 修改返回参数

 上图所示,返回参数应该是{"code":0,"msg":"1","data":"2"},实际返回结果:

4450abbccb4b1a128c038610d2fc0931ba8.jpg

我们来看下debug过程:

995d25a27a593ed23623f02e92f02899f22.jpg

转载于:https://my.oschina.net/niithub/blog/1925045

你可能感兴趣的文章
Android dumpsys命令的使用
查看>>
Linux Kernel系列一:开篇和Kernel启动概要
查看>>
BZOJ 2756: [SCOI2012]奇怪的游戏 网络流/二分
查看>>
master + worker模式的node多核解决框架——node-cluster
查看>>
Android如何实现超级棒的沉浸式体验
查看>>
使用node打造自己的命令行工具方法教程
查看>>
Express代理中间件问题与解决方案
查看>>
||和&&返回什么?
查看>>
linux在文件中查找指定字符串,然后根据查找结果来做进一步的处理
查看>>
在Oracle中删除所有强制性外键约束
查看>>
【R】R语言使用命令行参数 - [编程技巧(Program Skill)]
查看>>
经典算法题每日演练——第二题 五家共井
查看>>
存储过程中拼接的变量和点的问题
查看>>
ASP.NET那点不为人知的事(一)
查看>>
HTML 表格
查看>>
VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
查看>>
php 未实例化类调用方法的问题
查看>>
我对读计算机软件专业硕士的几点看法
查看>>
用JS写CSS
查看>>
TOJ4537: n阶行列式
查看>>