创建默认切入点 spring aop
Creating default pointcut spring aop
在我的控制器中使用 AOP 授权请求时,我使用了
有默认验证和特定验证,所以我没有定义特定切入点的请求是通过默认方法授权的。
@Before("execution(* com.example.controller.ExampleController.*(..))")
public void validate() {
validatePermissions("user", "create");
}
@Before("execution(* com.example.controller.*.*(..))")
public void validateUser() {
validatePermissions("admin", "admin");
}
问题是,即使我为用户案例定义了 特定验证 即使在请求我的示例控制器请求的情况下,它也是 总是默认一个.
我想要的是只有未被其他切入点覆盖的请求应该转到默认切入点
来自参考文档:Advice Ordering
当定义在同一个@Aspect class中的两个相同类型的通知(例如,两个@After通知方法)都需要运行相同的连接点,顺序未定义(因为无法通过反射为 javac 编译的 classes 检索源代码声明顺序)。考虑在每个 @Aspect class 中将此类建议方法折叠为每个连接点的一个建议方法,或者将建议片段重构为单独的 @Aspect classes,您可以通过 Ordered 或 @Order 在方面级别进行排序.
考虑到顺序未定义并且两个不同的 PCD 以相同的连接点为目标,因此在这两个之间不可能有回退或默认切入点。
您可以在折叠方面后对方面进行排序以将它们分开 @Aspect
classes ,检查授权状态(可能来自线程局部变量)或来自您可以获得的协议从连接点开始。
您可以使特定切入点可重用并在 && !specificPointcut()
条件下引用它们,大致如下(未经测试,仅在浏览器中编写):
@Pointcut("execution(* com.example.controller.ExampleController.*(..))")
public void specificPointcut() {}
@Before("specificPointcut()")
public void validate() {
validatePermissions("user", "create");
}
@Before("execution(* com.example.controller.*.*(..)) && !specificPointcut()")
public void validateUser() {
validatePermissions("admin", "admin");
}
您可以轻松地将其扩展到多个特定的切入点,可以是连续的,也可以是分层的,具体取决于您的情况。
按顺序排除切入点会像 && !(specificPc1() || specificPc2())
一样工作,并且按更常见的级别分层总是排除下一个更具体的级别。
在我的控制器中使用 AOP 授权请求时,我使用了
有默认验证和特定验证,所以我没有定义特定切入点的请求是通过默认方法授权的。
@Before("execution(* com.example.controller.ExampleController.*(..))")
public void validate() {
validatePermissions("user", "create");
}
@Before("execution(* com.example.controller.*.*(..))")
public void validateUser() {
validatePermissions("admin", "admin");
}
问题是,即使我为用户案例定义了 特定验证 即使在请求我的示例控制器请求的情况下,它也是 总是默认一个.
我想要的是只有未被其他切入点覆盖的请求应该转到默认切入点
来自参考文档:Advice Ordering
当定义在同一个@Aspect class中的两个相同类型的通知(例如,两个@After通知方法)都需要运行相同的连接点,顺序未定义(因为无法通过反射为 javac 编译的 classes 检索源代码声明顺序)。考虑在每个 @Aspect class 中将此类建议方法折叠为每个连接点的一个建议方法,或者将建议片段重构为单独的 @Aspect classes,您可以通过 Ordered 或 @Order 在方面级别进行排序.
考虑到顺序未定义并且两个不同的 PCD 以相同的连接点为目标,因此在这两个之间不可能有回退或默认切入点。
您可以在折叠方面后对方面进行排序以将它们分开 @Aspect
classes ,检查授权状态(可能来自线程局部变量)或来自您可以获得的协议从连接点开始。
您可以使特定切入点可重用并在 && !specificPointcut()
条件下引用它们,大致如下(未经测试,仅在浏览器中编写):
@Pointcut("execution(* com.example.controller.ExampleController.*(..))")
public void specificPointcut() {}
@Before("specificPointcut()")
public void validate() {
validatePermissions("user", "create");
}
@Before("execution(* com.example.controller.*.*(..)) && !specificPointcut()")
public void validateUser() {
validatePermissions("admin", "admin");
}
您可以轻松地将其扩展到多个特定的切入点,可以是连续的,也可以是分层的,具体取决于您的情况。
按顺序排除切入点会像 && !(specificPc1() || specificPc2())
一样工作,并且按更常见的级别分层总是排除下一个更具体的级别。