1. SpringBoot Starter自定義註解 - 介面加解密
目標
本章我們將編寫一個starter,目標如下:
1、對外提供 @OpenAPI 註解,使用此註解它會對接收的請求數據進行解密,對要返回的數據進行加密。
2、完成服務端使用示例
3、完成前端調用示例
加密規則
1、對業務數據進行AES加密,示意代碼:encryptData=AES("業務數據", aesKey)
2、對AES的key進行公鑰加密,示意代碼:encryptKey=RSA(aesKey, 公鑰)
3、簽名sign=md5(encryptData+encryptKey)
加密後請求示例
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
請求參數
服務端返回示例
pom.xml
定義註解
配置公私鑰
具體代搜行碼邏輯
定義切面和自動殲巧裝配
spring.factories
服務端修改
在業氏漏鍵務項目中引入jar 包
配置公私鑰
改動的地方很少,只需要在原介面增加@OpenAPI註解即可
前端修改
修改前代碼
修改後要先對參數加密,然後對返回數據解密
安裝兩個加密庫
封裝RSA、AES和Base64加解密
2. java註解是怎麼實現的
在Java中,註解是一種強大的工具,它通過結合反射機制來為程序元素添加元數據。註解就像是為代碼添加了特殊的標記,沒有註解則表示缺失相應的信息。編譯器、開發工具和其他程序可以通過反射來識別類、欄位、方法等元素上是否存在特定的註解,並根據這些註解執行相應的操作。例如,你可以定義自定義註解,如`@MyAnnotation`,並將其應用到類(`@MyAnnotation public class AnnotationTest`)或方法上。
註解的實現涉及元註解,如`@Retention`和`@Target`。`@Retention(RetentionPolicy.RUNTIME)`確保註解在運行時被保留,允許通過反射獲取;`@Target(ElementType.METHOD, ElementType.TYPE)`則指定註解可以用於方法和類型。此外,`@Documented`使註解包含在JavaDoc中,`@Inherited`允許子類繼承父類註解的屬性。
在實踐中,你可以定義註解屬性,如`@MyAnnotation color(String), value(String)`等,並提供默認值。例如,`@MyAnnotation(metaAnnotation=@MetaAnnotation(birthday="1988-2-18"), color="red", array={23, 26})`展示了如何在類中使用註解並為其屬性賦值。通過反射,可以檢查類是否帶有特定註解,獲取註解的屬性值,如顏色、枚舉值和數組等。
註解在提高代碼可讀性、代碼自文檔化以及框架集成等方面發揮重要作用,它們是Java語言中一種靈活且實用的編程技術。
3. java 自定義的註解有什麼作用
自定義註解,可以應用到反射中,比如自己寫個小框架。
如實現實體類某些屬性不自動賦值,或者驗證某個對象屬性完整性等
本人自己用過的驗證屬性值完整性:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceIgnoreProperty{
}
然後實體類中:
{
@IgnoreProperty
=1L;
@IgnoreProperty
privateIntegerresearchId;
@IgnoreProperty
privateTarUseruserId;
privateStringversion;
privateStringgrade;
....
}
然後action類中
//驗證數據完整性
Class<TarResearch>userClass=TarResearch.class;
Field[]field=userClass.getDeclaredFields();
for(inti=0;i<field.length;i++){
if(field[i].getAnnotation(IgnoreProperty.class)!=null){
continue;
}
Stringfie=field[i].getName().substring(0,1).toUpperCase()
+field[i].getName().substring(1);
Methodmethod=userClass.getMethod("get"+fie);
Objectobj=method.invoke(u);
if(obj==null){
sendResponseMsg(response,"數據錯誤");
returnnull;
}
}