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