springboot项目通过aop的 before获取请求参数值

原创
2020/05/15 11:17
阅读数 4.7K

1、before切面:(具体代码根据实际业务逻辑添加,这里只演示根据joinPoint获取请求参数值)

      //申明一个切点 里面是 execution表达式
	   @Pointcut("execution(* com.AAA.BBB.controller.*.*(..))")
	   private void controllerAspect(){}
	 
	  //请求method前打印内容
	   @Before(value = "controllerAspect()")
	   public void methodBefore(JoinPoint joinPoint) throws Exception{
           illegalParam(joinPoint);
       }

2、illegalParam:

 /**
	     * 获取参数列表
	     *
	     * @param joinPoint 切面对象
	     * @return
	     */
	    @SuppressWarnings("unchecked")
		private static boolean  illegalParam(JoinPoint joinPoint) {
	    	if(joinPoint == null){
	    		return false;
	    	}
	    	boolean flag = false;
	    	try{
		        // 参数值
		        Object[] args = joinPoint.getArgs();
		        for (int i = 0; i < args.length; i++) {
		        	String clsName = args[i].getClass().getName();
                    //如需其他类型参数的值,自行添加
		        	if(clsName.indexOf("String")>-1 || 
		        	   clsName.indexOf("Map")>-1 ||
		        	   clsName.indexOf("PO")>-1 ||
		        	   clsName.indexOf("File")>-1 || 
		        	   clsName.indexOf("RequestFacade")>-1){
		        		//string 
		        		if(checkObj(args[i])){
		        			flag = true;
		        			break;
		        		}
		        	}else if(clsName.indexOf("List")>-1){
	            		List<Object> list = (List<Object>)args[i];
	            		boolean innerFlag = false;
	            		for(Object obj: list){
	            			if(checkObj(obj)){
    		            		innerFlag = true;
    		            		break;
    		            	}
	            		}
	            		if(innerFlag){
	            			flag = true;
	            			break;
	            		}
	            	}
		        }
		        return flag;
	    	}catch(Exception e){
	    		logger.error(e.getMessage());
	    		return true;
	    	}
	    }
	    
	    private static boolean checkObj(Object obj){
	    	if(obj == null){
	    		return false;
	    	}
	    	try{
	    		String clsName = obj.getClass().getName();
	        	if(clsName.indexOf("String")>-1){
	        		//string 
                    System.out.println(obj);
	        		return false;
	        	}else if(clsName.indexOf("File")>-1){
	        		//附件单独判断
	        		return false;
	        	}else if(clsName.indexOf("Map")>-1){
	        		//map
	            	return checkMap(obj);
	            }else if(clsName.indexOf("PO")>-1){
	            	//复合类型(实体映射类)
	            	return checkPO(obj);
	            }else if(clsName.indexOf("RequestFacade")>-1){
	            	return false;
	            }else{
	            	return false;
	            }
	    	}catch(Exception e){
	    		logger.error(e.getMessage());
	    		return true;
	    	}
	    }
	    
	    /** 输出PO对象
	     * @param obj
	     * @return
	     */
	    private static boolean checkPO(Object obj){
	    	if(obj == null){
	    		return false;
	    	}
	    	boolean flag = false;
	    	try{
	    		Class<?> cls = obj.getClass();
            	//只能取到public getXXX方法的值
            	Method[] methods = cls.getDeclaredMethods();
            	for(Method mth: methods){
            		if(mth.getName().indexOf("get")>-1){
                        System.out.println(mth.invoke(obj));
            		}
            	}
	    		return false;
	    	}catch(Exception e){
	    		logger.error(e.getMessage());
	    		return true;
	    	}
	    }
	    
	    /**输出map的值
	     * @param obj
	     * @return
	     */
	    @SuppressWarnings("unchecked")
		private static boolean checkMap(Object obj){
	    	if(obj == null){
	    		return false;
	    	}
	    	boolean flag = false;
	    	try{
	    		Map<String,Object> tmp = (Map<String,Object>)obj;
            	Set<String> keys = tmp.keySet();
            	for(String key: keys){
                    //如果value值又是object类型的,需要再次判断,此处以value值是字符串为例
                    System.out.println(tmp.get(key));
            	}
	    		return flag;
	    	}catch(Exception e){
	    		logger.error(e.getMessage());
	    		return true;
	    	}
	    }

3、对于map,list,po对象的value值,又是map,list,po的情况,需要递归调用顶部的函数,知道value值是基本数据类型或string对象为止。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部