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

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

背景

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

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

Z同事的解决方案

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

自定义注解

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

1
2
3
4
5
6
7
8
9
10
java复制代码@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 的工厂
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
java复制代码@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 接口,将自定义的方法参数解析器加入到配置类中。

1
2
3
4
5
6
7
8
9
10
11
java复制代码@Configuration
@AllArgsConstructor
public class PayTenantWebConfig implements WebMvcConfigurer {

private final RsaVerifyArgumentResolver rsaVerifyArgumentResolver;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(rsaVerifyArgumentResolver);
}
}

这样我们就完成了自定义参数解析器解决方案的基础搭建,至于该怎么来使用它,我们将在下一节中进行讲解。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%