Scala 在play 2.5.X中创建过滤器

Scala 在play 2.5.X中创建过滤器,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我正在升级我的服务以使用Play(Scala)2.5.X。我无法将过滤器应用于所有响应。 以下是我添加到application.conf中的条目 play.http.requestHandler = "utils.SimpleHttpRequestHandler" play.http.filters="utils.CustomFilter" 我正在验证在“utils.SimpleHttpRequestHandler”中完成的每个请求,并按预期工作。但是,我无法使用筛选器将标题添加到响应中。 以

我正在升级我的服务以使用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应用程序时,并没有收到任何警告或错误,唯一的问题是过滤器不工作。
我缺少什么或我犯了什么错误?

CustomFilter
必须扩展
Filter
,但不能扩展
DefaultHttpFilters

看起来您没有应用
过滤器
,而且您的
应用程序.conf
条目错误

package foo

class Filters @Inject() (customFilter: CustomFilter) extends DefaultHttpFilters(customFilter)
您的
application.conf
条目应该是
play.http.filters=foo.filters

请参阅 和评论:

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

}


未应用筛选器的原因是您的操作不重要。

谢谢您的建议。我将CstomFilter更改为:
code
class CustomFilter@Inject()(隐式val-mat:materialer)扩展过滤器
code
Updated application.conf entry play.http.filters=“utils.filters”
code
class filters@Inject(),响应中未添加标题。感谢您的建议。
我将CustomFilter更改为:class CustomFilter@Inject()(隐式val mat:materialer)extensed Filter
更新的application.conf entry play.http.filters=“utils.filters”
class filters@Inject()(CustomFilter:CustomFilter)extensed DefaultHttpFilters(CustomFilter)
但仍然没有在响应中添加标题。
谢谢您的建议。我将CustomFilter更改为:class CustomFilter@Inject()(隐式val mat:materialier)extensed Filter Updated application.conf entry play.http.filters=“utils.filters”class filters@Inject()(CustomFilter:CustomFilter)扩展DefaultHttpFilters(CustomFilter),但是,标题未添加到响应中。@ShaileshTikhe
CustomFilter
必须扩展
Filter
not
DefaultHttpFilters
@ShaileshTikhe。。您的
CustomFilter
必须扩展
Filter
而不是
DefaultHttpFilters
。。。一切都会好起来的
  protected def filterHandler(request: RequestHeader, handler: Handler): Handler = {
handler match {
  case action: EssentialAction if inContext(request.path) => filterAction(action)
  case handler => handler
}