【发布时间】:2017-02-27 12:54:46
【问题描述】:
我正在将 play 应用程序从 2.4.6 迁移到 2.5.8。我被困在 play 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(两者都不在根包中) -> 只有Filter有效
2. 仅配置了 RequestHandler(根包中存在过滤器)-> 仅 RequestHandler 有效
3.仅配置过滤器(根包中存在RequestHandler)->仅RequestHandler有效
4. Filter 和 RequestHandler 均未配置(都存在于根包中)-> 只有 RequestHandler 有效
注意:已配置意味着我在 application.conf 中有条目
我想知道我在这里缺少什么。
【问题讨论】:
-
您是否尝试过扩展
DefaultHttpRequestHandler而不是HttpRequestHandler? -
@rethab:我修改了
RequestHandler以扩展DefaultHttpRequestHandler,但仍然没有效果。只有RequestHandler正在工作。它对你有用吗? -
我们不在 2.5 上。我建议附加一个调试器。
标签: scala filter playframework playframework-2.0