Scala Play 2.5过滤器,正确的方法吗?

时间:2017-04-18 19:41:13

标签: scala playframework playframework-2.5

我想知道在我的Play 2.5项目中添加自定义过滤器的正确方法是什么。播放文档(https://www.playframework.com/documentation/2.5.x/ScalaHttpFilters)表示要创建一个Filter类并将其添加到application.conf中。

通过覆盖BuiltInComponents中的httpFilters值(使用我的自定义过滤器序列),似乎还有另一种方法

这两种方法都有效吗?

2 个答案:

答案 0 :(得分:0)

您需要创建扩展Filter特征的类(这会强制您实现apply函数),在他们的示例中,他们创建了一个执行某些日志记录的过滤器:

class LoggingFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {

  def apply(nextFilter: RequestHeader => Future[Result])
           (requestHeader: RequestHeader): Future[Result] = {

    val startTime = System.currentTimeMillis

    nextFilter(requestHeader).map { result =>

      val endTime = System.currentTimeMillis
      val requestTime = endTime - startTime

      Logger.info(s"${requestHeader.method} ${requestHeader.uri} took ${requestTime}ms and returned ${result.header.status}")

      result.withHeaders("Request-Time" -> requestTime.toString)
    }
  }
}

您可以根据需要创建任意数量的这些内容。然后,要将这些实际挂钩到您的请求中,您需要创建HttpFilters特征的实现,您可以在其中指定要在每个请求上使用的过滤器。在他们的示例中,他们使用内置的GzipFilter来压缩响应,以及他们之前定义的LoggingFilter

class Filters @Inject() (
  gzip: GzipFilter,
  log: LoggingFilter
) extends DefaultHttpFilters(gzip, log)

如果您将此课程命名为Filters并将其放置在应用的根级别,Play会自动将其选中。如果您想重命名该类,或将其移动到其他地方,那么您必须将其添加到application.conf文件中,以便Play知道在哪里找到它:

play.http.filters=some.where.MyFilters

答案 1 :(得分:0)

两种方式:

  1. 自定义过滤器类,然后在application.conf
  2. 中配置该类
  3. 类名为过滤器,在根软件包
  4. 中扩展DefaultHttpFilters

    不要认为这是正确的方法,都是有效的。我个人而言,我不喜欢在根包中上课。