Фильтры

Пре-фильтр (before filter)

Если пре-фильтр отправляет ответ сервера (вызывает respond или forwardTo), то все остальные фильтры и сам контроллер не будет запущен.

import xitrum.Action
import xitrum.annotation.GET

@GET("before_filter")
class MyAction extends Action {
  beforeFilter {
    log.info("I run therefore I am")
  }

  // метод выполнится после всех фильтров
  def execute() {
    respondInlineView("Пре-фильтр должны быть выполнен, проверьте лог")
  }
}

Пост-фильтры (after filter)

Пост-фильтры запускаются после выполнения контроллера. Они не принимают аргументов и не возвращают значений.

import xitrum.Action
import xitrum.annotation.GET

@GET("after_filter")
class MyAction extends Action {
  afterFilter {
    log.info("Время запуска " + System.currentTimeMillis())
  }

  def execute() {
    respondText("Пост-фильтр должен будет запустится, проверьте лог")
  }
}

Внешние фильтры (around filter)

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("Внешний фильтр должен выполниться, проверьте лог")
  }
}

Если внешних фильтров будет несколько, они будут вложены друг в друга.

Порядок выполнения фильтров

  • Вначале выполняются пре-фильтры, затем внешние фильтры, и последними выполняются пост-фильтры.

  • Если пре-фильтр возвращает false, остальные фильтры (включая внешние и пост-фильтры) не будут запущены.

  • Пост-фильтры выполняются, в том числе, если хотя бы один из внешних фильтров выполнился.

  • Если внешний фильтр не вызывает action, вложенные внешние фильтры не будут выполнены.

before1 -true-> before2 -true-> +--------------------+ --> after1 --> after2
                                | around1 (1 of 2)   |
                                |   around2 (1 of 2) |
                                |     action         |
                                |   around2 (2 of 2) |
                                | around1 (2 of 2)   |
                                +--------------------+