看了同事写的代码,我竟然开始默默的模仿了。。。(一)

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」。

背景

事情是这样的,目前我正在参与 XXXX 项目的搭建,需要与第三方对接接口。在对方的接口中存在几个异步通知,为了接口的安全性,需要对接口的参数进行验签处理。

为了方便大家对异步通知返回参数的处理,Z 同事提出要将该验签功能进行统一封装,到时候大家只需要关注自己的业务逻辑即可。

Z同事的解决方案

Z 同事选择的是“自定义参数解析器”的解决方案,接下来我们通过代码来了解一下。

自定义注解

在自定义注解中定义一个方法:是否启用验签功能,默认验签。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface RsaVerify {
    
    /**
     * 是否启用验签功能,默认验签
     */
    boolean verifySign() default true;
}
复制代码

自定义方法参数解析器

创建自定义方法参数解析器 RsaVerifyArgumentResolver 实现 HandlerMethodArgumentResolver 接口,并实现里边的方法。

  1. supportsParameter:此方法用来判断本次请求的接口是否需要解析参数,如果需要返回 true,然后调用下面的 resolveArgument 方法,如果不需要返回 false。
  2. 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可以加入技术交流群参与讨论呦!

猜你喜欢

转载自juejin.im/post/7029239973513543687