Как мне реализовать Interceptor/Filter в игровой среде 2.4.3 (Scala)

Я новичок в Play Framework, и я хотел реализовать перехватчик или фильтр, который выполняется до того, как запрос перейдет в класс Action.

Я хотел перехватчик / фильтр, который возвращает ошибку HTTP (например, 401), если отсутствует определенная переменная заголовка.

Я немного погуглил и узнал об объекте Filter (play.api.mvc.Filter), но реализация возвращает mvc.Result вместо Response.

переопределить def apply(следующее: (mvc.RequestHeader) => Future[mvc.Result])(запрос: mvc.RequestHeader)

Другое решение, о котором я могу подумать, - это создать настраиваемое действие путем расширения ActionBuilder, но я бы предпочел не делать этого, если бы я мог разработать функцию перехвата всех функций, таких как Filter.

Любая помощь будет оценена. Спасибо.

2 ответа

Для дальнейшего использования. Это реализация фильтра. Спасибо Tryx за помощь.

import play.api.mvc
import play.api.mvc.{RequestHeader, Filter}
import play.api.mvc.Results._
import scala.concurrent.ExecutionContext.Implicits.global

class AuthorizedFilter(requestHeader: RequestHeader) extends Filter {



  private def authorizationRequired(request: mvc.RequestHeader) = {

    request.headers.get("Authorized").
      map( authorizedValue => authorizedValue.eq("ABCDEFG")).
      getOrElse(false)

  }


  override def apply(next: (mvc.RequestHeader) => Future[mvc.Result])(request: mvc.RequestHeader) =  {
      if(authorizationRequired(request)) {

        println("YOU are authorized!!")

        next(request)

      }
      println("NOT AUTHORIZED!")
      Future {Unauthorized }
    }
}

Создайте объект Filter в корневом уровне приложения. (/приложение).

import javax.inject.Inject

import play.api.http.HttpFilters

class Filters @Inject() (authorizedFilter: AuthorizedFilter) extends HttpFilters {

  def filters = Seq(authorizedFilter)
}

В вашем фильтре у вас есть 2 варианта, вы можете позвонить next который передает управление следующему фильтру или вы можете вернуть Future[Result] явно, который завершает цепочку. Если вы позвоните next, в конце концов цепочка фильтров закончится и она достигнет действия.

Похоже, вы хотите фильтр с apply метод как

apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[SimpleResult] = {
  if (headersok){
    next(request)
  } else {
    Future{ Unauthorized }
  }

}

Другие вопросы по тегам