我正在将播放应用程序从2.4.6迁移到2.5.8。我坚持在游戏2.5.X中使用过滤器
我创建了RequestHandler来验证请求和过滤器,它们应该对所有响应应用过滤器。
以下是我在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正常工作)。
当我从application.conf评论 play.http.requestHandler =“utils.RequestHandler”时,过滤器开始工作。
我尝试了更多,并观察到RequestHandler和Filters中只有一个一次工作
以下是我的观察:
1.配置Filter和RequestHandler(两者都不在root包中) - >只有过滤器工作
2.仅配置RequestHandler(过滤器存在于根包中) - >只有RequestHandler才能工作
3.仅配置过滤器(根包中存在RequestHandler) - >只有RequestHandler才能工作
4.没有配置Filter和RequestHandler(两者都存在于根包中) - >只有RequestHandler工作
注意:已配置表示我在application.conf中有条目
我想知道我在这里缺少什么。
答案 0 :(得分:2)
我认为Filter
和Filter
并不相互合作
我在Play 2.5.X中创建了一个新项目,默认情况下应用RequestHandler
。我在新项目中添加了Filter
,发现ReqestHandler
已停止工作
绝对应该在Filters
和RequestHandler
中存在某种关系
如果某人有Filter
和{{1}}工作,请解释如何。
答案 1 :(得分:2)
代替扩展HttpRequestHandler特性,扩展DefaultHttpRequestHandler
并提供所需的构造函数参数,如下所示,并覆盖方法handlerForRequest
。
class RequestHandler @Inject() (router: Router,
errorHandler: HttpErrorHandler,
configuration: HttpConfiguration,
filters: HttpFilters)
extends DefaultHttpRequestHandler(router , errorHandler, configuration, filters)
使用此方法,您还可以调用super.handlerForRequest(requestHeader)
,并在构造函数中通过HttpFilters
时,它将根据扩展{{1}的Filters
类的实现自动调用所有过滤器}。