Как мне реализовать 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 }
}
}