"Это 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: настоящий метод разрешения, который преобразует значение параметра в запросе в какой-либо объект.
- параметр параметр метода для разрешения
- mavContainer — ModelAndViewContainer текущего запроса (обеспечивает доступ к модели для запроса).
- webRequest текущий запрос
- Фабрика WebDataBinderFactory для создания WebDataBinders
@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, добро пожаловать в контакт с Ah Q, добавьте Ah Q, чтобы присоединиться к группе технического обмена для участия в обсуждении!