3

私は現在春の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 に ID があるかどうかを確認したいので、アドバイスで HttpSession のインスタンスを取得する必要がありますcheckSessionExist

しかし、それを取得する方法は?

最も簡単な方法は、次のHttpSessionようにすべてのジョイト ポイントに引数を追加することです。

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

ただし、これは AOP 自体に反します。私の意見では、ジョインポイントはアスペクトの存在を知る必要さえありませんね。

それを修正する方法?

4

1 に答える 1

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
    }
}
于 2013-01-21T03:30:48.617 に答える