在2.5.X中创建过滤器

时间:2016-10-17 10:08:35

标签: scala playframework playframework-2.0

我正在升级我的服务以使用Play(Scala)2.5.X.我坚持在所有回复中应用过滤器 以下是我添加到application.conf中的条目

play.http.requestHandler = "utils.SimpleHttpRequestHandler"
play.http.filters="utils.CustomFilter"

我正在验证在" utils.SimpleHttpRequestHandler "中完成的每个请求。并按预期工作。但是,我无法使用过滤器向响应中添加标题 以下是我的utils.CustomFilter:

@Singleton
class CustomFilter @Inject() (implicit val mat: Materializer) extends DefaultHttpFilters {
  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 = {
    val calendar = Calendar.getInstance()
    val dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z")
    dateFormat.setTimeZone(calendar.getTimeZone)
    dateFormat.format(calendar.getTime())
  }
}

以下是我的utils.SimpleHttpRequestHandler:

@Singleton
class SimpleHttpRequestHandler @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*/
}

当我运行play-app时,我没有收到任何警告或错误,唯一的问题是过滤器无效。 我错过了什么或我在做什么错误?

2 个答案:

答案 0 :(得分:0)

CustomFilter必须延长Filter,但不能DefaultHttpFilters

您似乎没有应用filter,而且您的application.conf条目也是错误的。

package foo

class Filters @Inject() (customFilter: CustomFilter) extends DefaultHttpFilters(customFilter)

您的application.conf条目应为play.http.filters=foo.Filters

答案 1 :(得分:0)

查看https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/http/HttpRequestHandler.scala#L180的源代码 和评论:

/ **    *更新给定的处理程序,以便在运行处理程序时,还将运行任何过滤器。该    *默认行为是通过调用filterAction来包装所有[[play.api.mvc.EssentialAction]],但要离开    *其他类型的处理程序不变。    * /

  protected def filterHandler(request: RequestHeader, handler: Handler): Handler = {
handler match {
  case action: EssentialAction if inContext(request.path) => filterAction(action)
  case handler => handler
}

}

未应用过滤器的原因是因为您的操作不是EssentialAction。