アクションフィルター

Beforeフィルター

Beforeフィルターが関数でアクションの実行前に実行されます。

  • 入力: なし
  • 出力: true/false

Beforeフィルターを複数設定できます。その中、ーつのbeforeフィルターが何かrespondするとき、その フィルターの後ろのフィルターとアクションの実行が中止されます。

import xitrum.Action
import xitrum.annotation.GET

@GET("before_filter")
class MyAction extends Action {
  beforeFilter {
    log.info("我行くゆえに我あり")
  }

  // This method is run after the above filters
  def execute() {
    respondInlineView("Beforeフィルターが実行されました。ログを確認してください。")
  }
}

Afterフィルター

Afterフィルターが関数でアクションの実行後に実行されます。

  • 入力: なし
  • 出力: 無視されます
import xitrum.Action
import xitrum.annotation.GET

@GET("after_filter")
class MyAction extends Action {
  afterFilter {
    log.info("実行時刻: " + System.currentTimeMillis())
  }

  def execute() {
    respondText("Afterフィルターが実行されました。ログを確認してください。")
  }
}

Aroundフィルター

import xitrum.Action
import xitrum.annotation.GET

@GET("around_filter")
class MyAction extends Action {
  aroundFilter { action =>
    val begin = System.currentTimeMillis()
    action()
    val end   = System.currentTimeMillis()
    val dt    = end - begin
    log.info(s"アクション実行時間: $dt [ms]")
  }

  def execute() {
    respondText("Around filter should have been run, please check the log")
  }
}

Aroundフィルターが複数あるとき、それらは外・内の構成でネストされます。

フィルターの実行順番

  • Beforeフィルター -> aroundフィルター -> afterフィルター。
  • あるbeforeフィルタがfalseを返すと、残りフィルターが実行されません。
  • Aroundフィルターが実行されると、すべてのafterフィルター実行されます。
  • 外のaround filterフィルターが action 引数を呼ばないと、内のaroundフィルターが実行されません。
before1 -true-> before2 -true-> +--------------------+ --> after1 --> after2
                                | around1 (1 of 2)   |
                                |   around2 (1 of 2) |
                                |     action         |
                                |   around2 (2 of 2) |
                                | around1 (2 of 2)   |
                                +--------------------+