AOP導入


前々から興味はあったけれども、なかなか手を付けてこなかった分野かな。


Actionクラスの中で、画面制御をするのにTokenを使うのはよくある手段だと思う。
これまではAbstractActionにメソッドを用意しておいて、実装クラスのexecute()の先頭で毎回読んでいた。
が、どうも人によって書いたり書かなかったりであまりよろしくないのである(もちろん気がついたところは修正しているが、それを頼られても困るわけである)。


そこでAOPの出番となる(はず)。

1.Jointpoint前にTokenをチェックする
1−1.問題なければsaveTokenをする
1−2.不正な場合はExceptionをthrowする
2.execute()の実行


うむ、完璧だ。


さて、肝心のSpringAOPだが、4つのAdviceが用意されている。
今回はBefore Adviceを使うわけである。

public class TokenManagementAdvice extends Action implements MethodBeforeAdvice {

(ログとか略)

  /**
   * Action#execute()の前に実行されるAdvice
   * isTokenValid()とsaveToken()を行う
   */
  public void before(Method m, Object[] args, Object target) throws Throwable {

    HttpServletRequest request = null;

    try{
      request = (HttpServletRequest) args[2];
    }catch(Exception e){
      log.warn("invalid arg" + e);
      return;
    }
    
    if (isTokenValid(request, false) == false) {
      log.warn("InvalidTransaction! : " + target.getClass() + m.getName());
      throw new InvalidTransactionException();
    }
    saveToken(request);
    
    if (log.isDebugEnabled()) {
      log.debug("Token check complete.");
    }
  }


isTokenValid()をするためにはActionクラスをextendsするのがちょっとあれなのだが、気にしない方向で。

struts-configではおなじみのspring連携

    <action path="/hogeInit"
            type="org.springframework.web.struts.DelegatingActionProxy"
            name="dummyForm"
            scope="request"
            validate="false">
        <forward name="success" path="/hoge"/>
    </action>


spring側の設定を次のように

    <bean name="/hogeInit"
      class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target">
              <bean class="hoge.hogeInitAction"
                  singleton="false">
              </bean>
            </property>
            <property name="interceptorNames">
                  <value>advice</value>
            </property>
    </bean>
    <bean id="advice" class="hoge.TokenManagementAdvice"/>


あとはAutoProxyとかを使うかどうかかぁ。
ダウンロードするところとかは画面遷移はないのでToken制御はいらないし、ここはちょっと考えどころかな。


【参考】
SpringによるAOPの導入*1
Spring AOPサンプルアプリでAOPを理解する*2

Java・J2EE・オープンソース Spring入門 ~より良いWebアプリケーションの設計と実装

Java・J2EE・オープンソース Spring入門 ~より良いWebアプリケーションの設計と実装