http接口接入签名校验

一,先实现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字段
在这里插入图片描述

至此,我们就完成了简单的接口签名校验了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值