gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:59:18 66 4
gpt4 key购买 nike

我现在正在学习 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/

66 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com