Spring boot 通过AOP获取参数名称及参数值并对参数进行校验

来源:互联网 发布:心理学考研 机构 知乎 编辑:程序博客网 时间:2024/05/25 19:58
/** * 定义切入点为 带有 NotEnableEmpty 注解的  */@Pointcut("@annotation(cn.acsm.paddy.manage.anotation.NotEnableEmpty)")public void params() {}/** * 定义环绕通知 * @param joinPoint * @throws ClassNotFoundException * @throws NotFoundException * @throws IOException */@Around("params()")public void doBefore(ProceedingJoinPoint joinPoint) throws ClassNotFoundException, NotFoundException, IOException {    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();    HttpServletRequest request = attributes.getRequest();    HttpServletResponse response = attributes.getResponse();    String classType = joinPoint.getTarget().getClass().getName();    Class<?> clazz = Class.forName(classType);    String clazzName = clazz.getName();    String methodName = joinPoint.getSignature().getName(); //获取方法名称    Object[] args = joinPoint.getArgs();//参数    Map<String, Object> nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName, args);//获取被切参数名称及参数值    System.out.println(nameAndArgs.toString());    List<Object> requestParams = RequestParamsContextHolder.getRequestParamsLocal();//获取不能为空的参数    RpcResponseEntity rpcResponseEntity = new RpcResponseEntity();    boolean hasEmptyParams = false;    for (Object o : requestParams) {        if (nameAndArgs.containsKey(o)) {            Object o1 = nameAndArgs.get(o);            if (o1 == null) {                rpcResponseEntity.setInvoke_result_code(RpcResponseEnum.LACK_NECESSARY_PARAMS.getCode());                rpcResponseEntity.setInvoke_result_message(RpcResponseEnum.LACK_NECESSARY_PARAMS.getMessage());                hasEmptyParams = true;                break;            }        }    }    if (hasEmptyParams) {        response.reset();        response.setCharacterEncoding("UTF-8");        response.setHeader("Content-Type", "text/plain;charset=UTF-8");        response.setHeader("icop-content-type", "exception");        OutputStream stream = response.getOutputStream();        net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(rpcResponseEntity);        stream.write(jsonObject.toString().getBytes("UTF-8"));    }    //获取参数名称和值    logger.info("当前调用接口-[" + request.getRequestURL() + "]");}/** * 通过反射机制 获取被切参数名以及参数值 * * @param cls * @param clazzName * @param methodName * @param args * @return * @throws NotFoundException */private Map<String, Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException {    Map<String, Object> map = new HashMap<String, Object>();    ClassPool pool = ClassPool.getDefault();    //ClassClassPath classPath = new ClassClassPath(this.getClass());    ClassClassPath classPath = new ClassClassPath(cls);    pool.insertClassPath(classPath);    CtClass cc = pool.get(clazzName);    CtMethod cm = cc.getDeclaredMethod(methodName);    MethodInfo methodInfo = cm.getMethodInfo();    CodeAttribute codeAttribute = methodInfo.getCodeAttribute();    LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);    if (attr == null) {        // exception    }    // String[] paramNames = new String[cm.getParameterTypes().length];    int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;    for (int i = 0; i < cm.getParameterTypes().length; i++) {        map.put(attr.variableName(i + pos), args[i]);//paramNames即参数名    }    return map;}
阅读全文
0 0
原创粉丝点击