[cubby-user:182] Re: Action#initialize への Interceptor 適用

BABA,Yasuyuki [E-MAIL ADDRESS DELETED]
2009年 10月 13日 (火) 10:48:22 JST


馬場です。

プラグインを使うと、アクション実行の前後に処理を追加できます。

アクションの実行に対して認証処理を追加するなら、Plugin#invokeAction でい
いと思います。

必要なことは

1.以下のようなプラグインを作って
----------------------------------------
package foo;

public class AuthenticationPlugin extends AbstractPlugin {
  public ActionResult invokeAction(ActionInvocation invocation)
    throws Exception {
    Class<?> actionClass = invocation.getActionContext();
    if (actionClass.getName().equals(対象クラス)) {
      認証処理
    } else {
      return super.invokeAction(invocation);
    }
  }
}
----------------------------------------

2.META-INF/services/org.seasar.cubby.plugin.Plugin というファイルを作っ
て、プラグインのクラス名を記述
----------------------------------------
foo.AuthenticationPlugin
----------------------------------------


このあたりはドキュメントに追加しないといけないですね。


Jun Futagawa さんは書きました:
> ふたがわです。
> 
> Cubby 2.0.x から initialize は ActionContextImpl が直接実行しているので、
> cubby-s2 の ActionMethodCustomizer を使うと、アクションメソッド実行時に
> Interceptor が実行される前に initialize が実行されてしまいます。
> 
> そのため、cubby-showcase にあるような authActionInterceptor は、
> その Interceptor が実行される前に initialize が実行されるので、
> 未ログイン状態で処理が実行されて困るケースがありました。
> 
> Cubby 1.1.x の時は initialize は initializeCustomizer から実行されていたので
> Interceptor の適用順で実行順が制御出来ていたので問題になっていませんでした。
> 
> 他にも、アクションメソッド実行前後のinitialize、prerender、postrender には
> j2ee.requiredTx が掛からないので、あまりないと思いますが更新処理があって
> ロールバックが必要な時にできなくて困ることがあるかなと思いました。
> 
> とりあえずの対応として、ActionMethodPointcutImpl#isApplied で
> invokeInitializeMethod を Interceptor 適用対象にしてみましたが
> これだと1つのアクションメソッド実行時に Interceptor が2回実行されてしまい、
> 微妙な気がしています。
> 
> @Override
> public boolean isApplied(final Method targetMethod) {
> 	if (targetMethod.getName().equals("invokeInitializeMethod")) {
> 		return true;
> 	}
> 	if (!ActionUtils.isActionMethod(targetMethod)) {
> 		return false;
> 	}
> 	return super.isApplied(targetMethod);
> }
> 
> 何か良い案あれば教えてください。
> 
> よろしくお願いします。
> 


-- 
BABA,Yasuyuki
[E-MAIL ADDRESS DELETED]


cubby-user メーリングリストの案内