我正在將應用程序從2.4.6遷移到2.5.8。我被困在使用2.5.X.中的過濾器。
我已經創建了RequestHandler,它對請求和過濾器進行了身份驗證,並將過濾器應用於所有響應。
過濾器不工作2.5.X
以下是我在application.conf
play.http.requestHandler="utils.RequestHandler"
play.http.filters="utils.Filters"
以下條目是我Filter.scala:
@Singleton
class Filters @Inject() (customFilter: CustomFilter) extends DefaultHttpFilters(customFilter)
@Singleton
class CustomFilter @Inject() (implicit val mat: Materializer) extends Filter {
def apply(nextFilter: RequestHeader => Future[Result])(requestHeader: RequestHeader): Future[Result] = {
nextFilter(requestHeader).map { result =>
result.withHeaders(
PRAGMA -> "no-cache",
CACHE_CONTROL -> "no-cache, no-store, must-revalidate, max-age=0",
EXPIRES -> serverTime
)
}
}
private def serverTime = { /* CODE */}
}
以下是我RequestHandler.scala
@Singleton
class RequestHandler @Inject() (router: Router) extends HttpRequestHandler {
def handlerForRequest(request: RequestHeader) = {
router.routes.lift(request) match {
case Some(handler) =>
val response = authenticate(request)
response match {
case Ok => (request, handler)
case Forbidden => (request, controllers.Application.forbidden)
case Unauthorized => (request, controllers.Application.unauthorized)
case _ => (request, controllers.Application.badRequest)
}
case None => (request, Action(Results.NotFound))
}
}
/* OTHER HELPER METHOD CODE*/
}
我能運行播放應用程序,但過濾器不起作用(RequestHandler作品co rrectly)。
當我從application.conf中註釋play.http.requestHandler =「utils.RequestHandler」時,過濾器開始工作。
我嘗試了更多,並發現只有一個RequestHandler和Filters同時工作。
以下是我的觀察:
1.過濾和RequestHandler被配置(兩者都不是在根包) - >只有過濾器的工作原理
2.僅RequestHandler被配置(存在於根包濾波器) - >只有RequestHandler工作
3.只有濾波器被配置(RequestHandler存在於根包) - >只有RequestHandler工作
4.無濾波器和RequestHandler被配置(兩者都存在於根包) - >只有RequestHandler工作
注:配置裝置我在application.conf中輸入
我想知道我在這裏丟失了什麼。
你有沒有試過擴展'DefaultHttpRequestHandler'而不是'HttpRequestHandler'? – rethab
@rethab:我修改了'RequestHandler'來擴展'DefaultHttpRequestHandler',但仍然沒有效果。只有'RequestHandler'正在工作。它對你有用嗎? – Shailesh
我們不在2.5。我建議附加一個調試器。 – rethab