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