Spring AOP拦截指定Controller类及区分请求源的问题
控制器拦截与区分方案
一、精准拦截A、B控制器,排除C
不想用包级别的切点的话,直接给目标类单独配置切点即可,用逻辑或连接:
@Pointcut("within(aa.bb.controller.A) || within(aa.bb.controller.B)") public void interceptAB() {}
这个切点只会匹配A和B类中的所有方法调用,完全不会涉及C控制器。
如果A、B有共同的父类或接口(而C没有实现),也可以这么写(适合后续新增同类型控制器的场景):
@Pointcut("within(aa.bb.controller.CommonController+) && !within(aa.bb.controller.C)") public void interceptAB() {}
二、区分请求发往A还是B
在切面的通知方法里,通过JoinPoint就能直接拿到目标类的信息,轻松区分:
@Before("interceptAB()") public void beforeInvoke(JoinPoint joinPoint) { Class<?> targetClass = joinPoint.getTarget().getClass(); if (targetClass.equals(A.class)) { // 处理A控制器的请求 } else if (targetClass.equals(B.class)) { // 处理B控制器的请求 } }
也可以简化成拿类名判断:
String className = joinPoint.getTarget().getClass().getSimpleName(); switch(className) { case "A": // 处理A break; case "B": // 处理B break; }
更新说明:感谢各位的帮助!我发现原本的想法实现难度较高,因此选择为不同控制器分别配置,虽能完成需求,但仍期待未来有更优的解决方案。
内容的提问来源于stack exchange,提问作者Abe
相关产品推荐
相关产品推荐

