一,先实现spring提供的validator类
validator接口是 Spring 框架中用于数据验证的接口。它是 Spring 提供的一种验证机制,用于在数据绑定之前对用户输入的数据进行验证和校验。
随便写一个request类,这是父类,所有的request类都要实现该类,才能走签名校验,sign就是我们需要的签名校验字段
@Data
@ToString
public class BaseRequest {
private String nonce;
private String timestamp;
private String sign;
private String appId;
}
二,对所有controller接口进行校验
1,@ControllerAdvice注解:是一个用于处理全局异常、全局数据绑定和全局数据预处理的注解,这里我们用到的是全局数据预处理
2,@InitBinder 注解:用于在控制器(Controller)中标注于方法上,表示为当前控制器注册一个属性编辑器,只对当前的Controller有效。 @InitBinder标注的方法必须有一个参数WebDataBinder。webDataBinder是用于表单到方法的数据绑定的。所谓的属性编辑器可以理解就是帮助我们完成参数绑定。 @InitBinder只在@Controller中注解方法来为这个控制器注册一个绑定器初始化方法,方法只对本控制器有效。
@ControllerAdvice
@Slf4j
public class RequestValidatorControllerAdvice {
@Autowired
private List<Validator> validatorList;
@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
log.debug("启动validator校验");
if (validatorList != null) {
log.debug("ValidatorList:{},:{}",validatorList,webDataBinder.getTarget());
for (Validator validator : validatorList) {
boolean b = webDataBinder.getTarget() != null && validator.supports(webDataBinder.getTarget().getClass());
log.debug("validator开始校验,校验结果:{}", b);
if (b) {
webDataBinder.addValidators(validator);
}
}
}
}
}
三,实现validator签名校验接口
实现spring提供的validator接口,support的判断条件用的是不是继承于我们的request父类
@Slf4j
@Component
public class RequestSignValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return BaseRequest.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
BaseRequest baseRequest= (BaseRequest) target;
log.debug("BaseReq参数校验:{}",baseRequest);
String appId = baseRequest.getAppId();
String nonce = baseRequest.getNonce();
String timestamp = baseRequest.getTimestamp();
StringBuffer sb = new StringBuffer();
if (StringUtils.isNotBlank(appId)){
sb.append(appId);
}
if (StringUtils.isNotBlank(nonce)){
sb.append(nonce);
}
if (StringUtils.isNotBlank(timestamp)){
sb.append(timestamp);
}
sb.append("test_sign");
if (!sb.toString().equalsIgnoreCase(baseRequest.getSign())) {
throw new RuntimeException("签名异常");
}
}
}
四,测试校验下
简单写个测试接口
加上错误的sign字段postMan请求下报错了
看日志报签名错误
我们加上正确的sign字段
至此,我们就完成了简单的接口签名校验了