「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」。
背景
事情是这样的,目前我正在参与 XXXX 项目的搭建,需要与第三方对接接口。在对方的接口中存在几个异步通知,为了接口的安全性,需要对接口的参数进行验签处理。
为了方便大家对异步通知返回参数的处理,Z 同事提出要将该验签功能进行统一封装,到时候大家只需要关注自己的业务逻辑即可。
Z同事的解决方案
Z 同事选择的是“自定义参数解析器”的解决方案,接下来我们通过代码来了解一下。
自定义注解
在自定义注解中定义一个方法:是否启用验签功能,默认验签。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface RsaVerify {
/**
* 是否启用验签功能,默认验签
*/
boolean verifySign() default true;
}
复制代码
自定义方法参数解析器
创建自定义方法参数解析器 RsaVerifyArgumentResolver 实现 HandlerMethodArgumentResolver 接口,并实现里边的方法。
- supportsParameter:此方法用来判断本次请求的接口是否需要解析参数,如果需要返回 true,然后调用下面的 resolveArgument 方法,如果不需要返回 false。
- resolveArgument:真正的解析方法,将请求中的参数值解析为某种对象。
- parameter 要解析的方法参数
- mavContainer 当前请求的 ModelAndViewContainer(为请求提供对模型的访问)
- webRequest 当前请求
- WebDataBinderFactory 用于创建 WebDataBinder 的工厂
@AllArgsConstructor
@Component
public class RsaVerifyArgumentResolver implements HandlerMethodArgumentResolver {
private final SecurityService securityService;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(RsaVerify.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
RsaVerify parameterAnnotation = parameter.getParameterAnnotation(RsaVerify.class);
if (!parameterAnnotation.verifySign()) {
return mavContainer.getModel();
}
//对参数进行处理并验签的逻辑
......
//返回处理后的实体类参数
return ObjectMapperFactory
.getDateTimeObjectMapper("yyyyMMddHHmmss")
.readValue(StringUtil.queryParamsToJson(sb.toString()), parameter.getParameterType());
}
}
复制代码
创建配置类
创建配置类 PayTenantWebConfig 实现 WebMvcConfigurer 接口,将自定义的方法参数解析器加入到配置类中。
@Configuration
@AllArgsConstructor
public class PayTenantWebConfig implements WebMvcConfigurer {
private final RsaVerifyArgumentResolver rsaVerifyArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(rsaVerifyArgumentResolver);
}
}
复制代码
这样我们就完成了自定义参数解析器解决方案的基础搭建,至于该怎么来使用它,我们将在下一节中进行讲解。如果你有不同的意见或者更好的idea
,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!