aop - 如何在 spring aop 中将上下文参数传递给建议

标签 aop spring-aop

我现在正在学习 spring aop,我不知道将上下文参数传递给建议。

请注意,我指的是 context 参数,而不是 normal 参数。

传递普通参数很简单,例如:

a join point:
public void read(String something){

}

@Aspect
public class SessionAspect {
    @Pointcut("execution(* *.*(String)) &&args(something)")
    public void sess() {
    }

    @Before("sess()")
    public void checkSessionExist(String something) {
        //Here
    }
}

然后 something 参数将被传递给通知 checkSessionExist

但是我想获取 HttpSession 之类的上下文参数怎么样?

a join point:

public void listUser(){
    dao.list(User.class,.....);
}

@Aspect
public class SessionAspect {
    @Pointcut("execution(* *.*(String))")
    public void sess() {
    }

    @Before("sess()")
    public void checkSessionExist(String something) {
        //Here
    }
}

在此示例中,listUser 连接点仅允许登录用户使用。

所以我想检查当前HttpSession中是否有一个名称,所以我需要在提示checkSessionExist中获取一个HttpSession的实例。

但是如何获取呢?

最简单的方法是将 HttpSession 参数添加到所有的连接点,如下所示:

public void listUser(HttpSession session){
    dao.list(User.class,.....);
}

然而,这违背了 AOP 本身。在我看来,连接点甚至不需要知道Aspect的存在,不是吗?

如何解决?

最佳答案

您可以在 @Aspect 本身中获取 HttpSession 引用,而不是通过 @Pointcuts 传递 HttpSession

RequestContextHolder.currentRequestAttributes()
.getAttribute("user", RequestAttributes.SCOPE_SESSION)

@Aspect
public class SessionAspect {

    // fetch the current HttpSession attributes and use as required 
    private ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();


    @Pointcut("execution(* *.*(String))")
    public void sess() {
    }

    @Before("sess()")
    public void checkSessionExist(String something) {
        //Here
    }
}

关于aop - 如何在 spring aop 中将上下文参数传递给建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13983796/

相关文章:

Spring 依赖注入(inject)或切面编程

java - 防止 Spring AOP 关闭我的 Stream?

java - 如何使用代理解析从 SimpleJpaRepository<T,ID> 对象中获取存储库接口(interface)对象

java - Spring 4 AOP:获取异常 java.lang.IllegalArgumentException:错误 at::0 在切入点中正式未绑定(bind)

junit - Spring AOP - @Pointcut : @Before advice for @Test methods does not work

java - 带注释字段的 Spring AOP 切入点表达式

postsharp - 如何广泛应用 Postsharp 方面解决方案(命名空间中的所有类)

Javascript AOP 支持

java - tomcat下调试外部库,不修改

java - 将spring aop添加到不覆盖父类方法的类的方法中