/** * 定义切入点为 带有 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; }
Spring boot 通过AOP获取参数名称及参数值并对参数进行校验
最新推荐文章于 2024-07-05 10:07:39 发布