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加解密實現

從上面圖中可以看到,測試類的斷言也正常通過。

本來是打算將原理以及實際操作在本篇都梳理和展示下,但整理實際操作後發現篇幅已經很大,故打算分兩篇講解,本篇先講解實際操作,下篇再梳理涉及的原理。

本篇完。

持續更新完善中......歡迎關注轉發,共同學習


分享到:


相關文章: