3

我现在正在学习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中是否有一个标识,所以我需要在advice中获取一个HttpSession的实例checkSessionExist

但是如何获得呢?

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

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

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

如何解决?

4

1 回答 1

1

而不是通过HttpSessionvia ,您可以在自身中@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
    }
}
于 2013-01-21T03:30:48.617 回答