【问题标题】:Scala Play 2.5 Filters, Correct way to do them?Scala Play 2.5 过滤器,正确的做法?
【发布时间】:2017-09-14 19:17:46
【问题描述】:

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

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

这两种方法都有效吗?

【问题讨论】:

    标签: scala playframework playframework-2.5


    【解决方案1】:

    两种方式:

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

    不要认为有正确的方法,两者都有效。就我个人而言,我不喜欢在根包中有类。

    【讨论】:

      【解决方案2】:

      您需要创建扩展 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
      

      【讨论】:

      • 在我的应用程序中,我正在扩展这个名为 BuiltInComponents 的特性,我可以覆盖 BuiltInComponents 中存在的 HttpFilters 值吗?
      • BuiltInComponents 用于依赖注入。我会坚持他们在文档中推荐的方式(与我在回答中概述的方式相同)。
      • 依赖注入是什么意思?在文档中他们使用带有@Inject 的Guice,但是在我的项目中我使用的是Macwire;不会有冲突吗?
      • “Play 提供了一个 BuiltInComponents 特征,允许您创建一个纯 Scala 实现,在编译时将您的应用程序连接在一起”。来自这里:playframework.com/documentation/2.5.x/ScalaDependencyInjection.
      • 是的,在 BuiltInComponents 中我不能只覆盖 HttpFilters 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      相关资源
      最近更新 更多