You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:03:15