Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

本文主要使用Springboot进行多模块项目的实现方式,并结合接口测试常用框架rest assured以及AES加解密来综合讲解多模块项目的一些常用功能的实现。并作为后续Springcloud的序篇,后面我会以模块化项目的方式来逐步实现Springcloud各个组件的讲解与代码演示,以期和大家一起对Springcloud常用功能有更深入的理解。

我们常见的Maven项目都是所有功能包都在一个项目中,这样导致的一个问题是,一些公共的代码如基础工具类等代码,可能每个Maven项目都会独立保存着一份副本,代码的坏味道由此产生,而采用模块化的方式组织项目,则能最大程度的复用一些代码块,对维护管理都带来了极大的便利。

本文主要包括:

1、主模块图文展示

2、加解密模块图文展示

3、web模块图文展示

4、实现效果图文展示

1、主模块

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

1.1、模块结构

从主模块可以看出,我们这次的项目主要包括两个子模块,分别是web和aestest两个模块,两个模块文件夹里面为各自的项目文件,且主模块中未定义其他包和类。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

1.2、pom.xml文件

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

为防止大家看不清图片中文字,这里再列出下:

(1) 、主模块名,也是子模块web和aestest的父模块名。

(2) 、子模块名,可以添加多个。

(3) 、此处为pom。

(4) 、这里我们使用springboot的2.0.3版本。

(5) 、帮助我们编写getter或者equals方法的一个“工具”,暂时未用到。

2、加解密模块

2.1、模块结构

加解密模块主要有两个包,aesutil和exception包,其中aesutil才是我们这个模块的主角,exception包只是一个自定义的异常类而已,因这两个类在网上很容易就能搜到或自己实现,这里对AESUtil和CommonException不再进行展示,只要记住我们会用AESUtil中encrypt方法进行加密,使用decrypt方法进行解密即可。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

2.2、pom.xml文件

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(1)、主模块名,也就是父模块名。

(2)、本模块名。

(3)、加解密时用到的辅助类。

3、web模块

3.1、模块结构

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

上图中我抹去的类为无关类,为避免影响,这里我抹去,仅展示和本次示例相关的类,不过像util中的工具类,如果其他模块也需要使用,那么就可以单独建一个工具类的模块,让其他模块通过Maven分别引入即可,以达到复用的目的,这里仅web模块使用,故暂未抽取单独建模块。

3.2、pom.xml文件

这里仅展示pom文件中和本文有关的依赖。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(1)、主模块名,也就是父模块名。

(2)、本模块名。

(3)、web模块中引入我们的加解密模块aestest依赖。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(1)、我们用到的接口测试框架rest-assured的依赖。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(1)、用来操作json数据的依赖。

(2)、此处设置为springboot的启动类,以便打成jar后能正常启动。

3.3、Java类代码示例

3.3.1、web模块中Springboot的启动类。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

3.3.2、请求发送类AesTestController

本类主要用来接收未加密的请求数据,使用AES加密后再通过rest-assured转发给需要加密数据的接口。鉴于后面可能会实现一些复杂的校验功能等,而rest-assured能较好满足,故此处rest-assured。(其实也是可以使用其他可以发送http请求的一些框架或jar工具类或直接使用重定向代替)。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

注:上图中存入resultData的解密后数据类型为String,故不能正常的使用rest-assured的jsonpath进行解析和断言,如果想使用该功能,则应该将字符串类型转换为JSONObejct类型。下文会有演示。

(1)、导入aestest模块的AESUtil类;

(2)、此处为静态导入;

(3)、为返回的json数据添加错误状态码,见下图;

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(4)、直接使用静态导入的方法;

(5)、设置contentType类型,常见的有xml和json;

(6)、将请求数据放入请求的body体;

(7)、设置请求地址并发送发送post请求;

(8)、将响应转为字符流;

(9)、使用aestest模块的AESUtil.decrypt()方法进行AES解密。

3.3.3、加密请求接收处理类OperateJsonController

本类主要用来接收加密的请求数据,使用AES解密后处理请求数据后再使用AES将响应加密后返回给调用接口。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(1)、导入aestest模块的AESUtil类;

(2)、发送方和接收方约定的秘钥;

(3)、解密前的请求数据;

(4)、解密以及解密后的请求数据;

(5)、将解密后的数据转为json并添加响应信息;

(6)、将返回数据进行加密后再返回;

4、实现效果图文展示

终于到了收获的时刻了,让我们一起看下效果怎么样,能不能达到我们的预期吧。

4.1、打jar包

我们要打jar包时,需要用主模块进行打jar包,因为我们设置的启动类在web模块中,所以打好的jar包会在web模块的target目录下,如下面图所示。


Springcloud序之Springboot2x模块化+rest assured+AES加解密实现


Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

4.2、Maven打jar包成功后控制台如下面所示:

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(1)、跳过了测试;

(2)、打好的jar包所在路径;

(3)、一共三个Maven模块,即我们的主模块hi-uuut 和两个子模块web和aestest;

4.3、设置Windows的cmd命令窗口显示中文不乱码

由于我Windows的cmd命令窗口显示日志为乱码,所以我这里设置下。

<1、打开CMD窗口;

<2、输入 CHCP,然后回车看下当前的编码;

<3、输入CHCP 65001然后回车;

<4、在窗体上右键,选择属性,将字体设置为Lucida Console;

<5、此时你的cmd窗口就支持UTF8了。

4.4、启动jar

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现


Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

4.5、测试类

我们写了一个使用rest-assured的测试类,通过给未加密接口发送post请求来进行测试,请求未加密的地址:http://localhost:8080/uuutsend/senddata。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

(1)、拼装非加密的请求地址;

(2)、json中存入加密的请求地址和秘钥,作为非加密请求向加密请求转换的元数据;

(3)、content为加密请求地址映射的方法所处理的真正内容;

(4)、关于此处见上文解释,需要注意的是这里使用的为request方法,作用是可以将http请求类型作为参数来进行动态切换;

(5)、使用rest-assured的jsonpath进行解析并断言响应数据是否正确,正确才执行下面的打印语句,不正确程序直接停止,使用equalTo方法表示数据必须完全一致才算正确,当然也有包含等各种常用断言,这里暂时未展示。

4.6、cmd控制台结果如下面图所示:

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

可见模块化后的加解密以及处理请求等功能都正常,和我们预期的一致。

4.7、测试类的控制台展示

因为我们测试类使用Java语言结合junit写的,故我们需要观察eclipse的控制台。如下面图所示:

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

此时控制台junit是未通过的,原因是rest-assured进行断言时未找到responseCode这个参数,到这里可能大家就会觉得奇怪,明明解密后的响应数据中是有responseCode这个字段的,但是为什么通过jsonpath解析会解析不到呢,下面我们将打印响应的方法放在断言前面,先打印下响应信息,看下情况,结果如下面所示。

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

从上图可以看出,调换顺序响应信息正常打印出来了,但断言还是失败。通过观察控制台打印的响应信息,我们发现senddata-响应数据解密后的value值虽然是json格式,但却是json字符串,而不是json类型的响应数据。所以jsonpath不能正常的进行解析,造成会断言失败。分析到这里,我们就知道怎么解决了,首先将解密后的数据类型由String转为JSONObject,然后再返回即可。在AesTestController类中进行修改,如下面图所示:

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

然后我们再次进行测试,结果如下图所示:

Springcloud序之Springboot2x模块化+rest assured+AES加解密实现

从上面图中可以看到,测试类的断言也正常通过。

本来是打算将原理以及实际操作在本篇都梳理和展示下,但整理实际操作后发现篇幅已经很大,故打算分两篇讲解,本篇先讲解实际操作,下篇再梳理涉及的原理。

本篇完。

持续更新完善中......欢迎关注转发,共同学习


分享到:


相關文章: