Прочитав код, написанный моим коллегой, я начал молча его имитировать. . . (один)

задняя часть
Прочитав код, написанный моим коллегой, я начал молча его имитировать. . . (один)

"Это 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: настоящий метод разрешения, который преобразует значение параметра в запросе в какой-либо объект.
    • параметр параметр метода для разрешения
    • 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, чтобы присоединиться к группе технического обмена для участия в обсуждении!