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对象为止。