import .;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
@Aspect
@Component
public class AuthAspect {
/**
* 包及子包下的所有类的所有方法使用aop
* 下的list方法不使用aop
*/
@Pointcut(value = "execution(* ..*.*(..)) && !execution(* (..))")
public void sdkAuth() {
}
/**
* 案例:通过aop控制公共参数的校验
* 1.针对下面的接口,使用@RequestParam注解,不管是get/post请求,都是有效的
* #getParameter,调用接口时的参数为appId=xxx或者groupAppId=xxx,使用getParameter("appId");都可以获取到,但getParameter("groupAppId")只可以获取到groupAppId=xxx
* 3.在通知中,是针对方法列表中的参数名,而非注解指定的参数名
* public Object list(String accessToken, @RequestParam("appId") String groupAppId, String subGroupAppId) {}
*
* @param joinPoint
* @return
*/
@Around("sdkAuth()")
public Object doAround(ProceedingJoinPoint joinPoint) {
MethodSignature methodSignature = (MethodSignature) ();
String[] parameterNames = ();
// 获取accessToken的下表
int accessTokenIndex = (parameterNames, "accessToken");
// 获取groupAppId的下标
int groupAppIdIndex = (parameterNames, "groupAppId");
// 获取subGroupAppId的下标
int subGroupAppIdIndex = (parameterNames, "subGroupAppId");
if (accessTokenIndex == -1 || groupAppIdIndex == -1 || subGroupAppIdIndex == -1) {
return "error";
}
/**
* 方法参数的值,返回的数组按照方法定义的顺序,对于null值的,在debug时,不会显示null的数组下标,例如:
* public Object list(String accessToken, @RequestParam("appId") String groupAppId, String subGroupAppId) {}
* 传参:accessToken=xxx&subGroupAppId=xxx
* Object[] args = ();获取的值,在debug时
* args[0] = xxx
* args[2] = xxx
* 对于args[1],虽然debug时没有显示这个变量,但实际上它是存在的,值为null
*/
Object[] args = ();
String accessToken = (args[accessTokenIndex]);
String groupAppId = (args[groupAppIdIndex]);
String subGroupAppId = (args[subGroupAppIdIndex]);
if ((accessToken, "null") || (groupAppId, "null") || (subGroupAppId, "null")) {
return "error";
}
try {
return ();
} catch (Throwable e) {
return "success";
}
}
}