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

时间:2012-12-21 03:12:52

标签: 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的存在,不是吗?

如何解决?

1 个答案:

答案 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
    }
}