@Pointcut("execution(public * net.parim.spark.portal.*.controller..*.*(..))")
public void canVisitHome() {}
@Before("canVisitHome()")
public void doBefore() {
}
写拦截器解决时,之前没有传递过参数,aop很轻松的就实现了,如今 想想在切点方法里面传递自己参数,却发现项目跑不起来了报错error at ::0 formal unbound in pointcut,解决办法是在注解声明即可以
@Before("canVisitHome() && args(request,userToken)")
public void doBefore(HttpServletRequest request,UserToken userToken) {
Site site = portalCommonService.getSite(request, userToken);
if(!(site.getAnonymousAccess() && applicationProperties.getLoginWithCurrentSite())){//如果不允许匿名访问返回401
throw new UnauthenticatedException();
}
}
注意:追加参数时只能拦截到参数对应的方法,如果参数不应则无法通过切面,即拦截不生效。
想要继续生效,可采用切面动态传参技术
@Before("canVisitHome() && args(request,userToken,..)")
public void doBefore(HttpServletRequest request,UserToken userToken){
if(null == userToken.getCurrentSite()){
Site site = portalCommonService.getSite(request, userToken);
if(!(site.getAnonymousAccess() && applicationProperties.getLoginWithCurrentSite())){//如果不允许匿名访问返回401
throw new UnauthenticatedException();
}
}
}
需要注意的是,需要切面的方法参数的顺序要一致,并且以这两个参数开头。