我想知道在我的Play 2.5项目中添加自定义过滤器的正确方法是什么。播放文档(https://www.playframework.com/documentation/2.5.x/ScalaHttpFilters)表示要创建一个Filter类并将其添加到application.conf中。
通过覆盖BuiltInComponents中的httpFilters值(使用我的自定义过滤器序列),似乎还有另一种方法
这两种方法都有效吗?
答案 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)
两种方式:
DefaultHttpFilters
,
醇>
不要认为这是正确的方法,都是有效的。我个人而言,我不喜欢在根包中上课。