• 参数注解1


    定义注解类:

    @Target({ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface StrictEncryptedIdParam {
        String value();
    
        String encryptedIdType();
    
        boolean required() default true;
    
        String defaultValue() default "
    		
    		
    ue000ue001ue002
    				
    ";
    }

    定义解析器:

    public final class StrictEncryptedIdAnnotationResolver implements HandlerMethodArgumentResolver {
    
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.hasParameterAnnotation(StrictEncryptedIdParam.class);
        }
    
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
            if (parameter.getParameterType() != Long.class
                    && parameter.getParameterType() != long.class) {
                throw new RuntimeException("EncryptedIdAnnotation must be on long field");
            }
            HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
            String idType = "";
            String paramName = StringUtils.EMPTY;
            boolean isRequired = false;
            String defaultValue = "";
            if (parameter.hasParameterAnnotation(StrictEncryptedIdParam.class)) {
                StrictEncryptedIdParam encryptedIdParam = parameter.getParameterAnnotation(StrictEncryptedIdParam.class);
                idType = encryptedIdParam.encryptedIdType();
                paramName = encryptedIdParam.value();
                isRequired = encryptedIdParam.required();
                defaultValue = encryptedIdParam.defaultValue();
            }
            if (StringUtils.isEmpty(paramName)) {
                paramName = parameter.getParameterName();
            }
            String parameterValue = request.getParameter(paramName);
            if (StringUtils.isEmpty(parameterValue) || StringUtils.isEmpty(idType)) {
                if (!defaultValue.equals(ValueConstants.DEFAULT_NONE)) {
                    return Long.parseLong(defaultValue);
                }
                if (isRequired) {
                    throw new MissingServletRequestParameterException(paramName,
                            parameter.getParameterType().getTypeName());
                }
                return 0L;
            }
            if (StringUtils.isNumeric(parameterValue)) {
                throw new IllegalArgumentException("参数错误");
            }
            if (parameterValue.length() < 8) {
                throw new IllegalArgumentException("参数错误");
    
            }
            return resolveLong(parameterValue, idType, paramName);
        }
    
        private long resolveLong(String parameterValue, String idType, String paramName) {
            long decryptedId = IdEncryptor.decrypt(parameterValue, EncryptedIdType.of(idType));
            if (!StringUtils.equals(String.valueOf(decryptedId), parameterValue)) {
                CommonWebScope.paramBundle().putDecryptedIdIntoParams(paramName, decryptedId);
            }
            return decryptedId;
        }
    }
  • 相关阅读:
    迭代器
    装饰器
    函数对象和闭包
    函数的使用
    文件操作
    基本数据类型及内置方法
    MySQL数据库
    网络编程进阶(进程、线程、协程、IO模型)
    网络编程基础---网络通讯原理、ssh远程执行命令、粘包问题处理、文件传输处理
    面向对象、类、元类、封装、异常处理
  • 原文地址:https://www.cnblogs.com/koushr/p/11907842.html
Copyright © 2020-2023  润新知