我现在正在学习弹簧,我不知道将上下文参数传递给建议。
注意我的意思是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的存在,不是吗?
如何解决?
答案 0 :(得分:1)
您可以通过HttpSession
本身获取@Pointcuts
引用,而不是通过HttpSession
传递@Aspect
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
}
}