【问题标题】:Creating filters in play 2.5.X在 play 2.5.X 中创建过滤器
【发布时间】:2017-06-27 11:22:55
【问题描述】:

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

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案1】:

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

    看起来您没有应用filter,而且您的application.conf 条目也有误。

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

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

    【讨论】:

    • 感谢您的建议。我将 CstomFilter 更改为:codeclass CustomFilter @Inject() (implicit val mat: Materializer) extends Filtercode Updated application.conf entry play.http.filters="utils.Filters" codeclass Filters @Inject( ) (customFilter: CustomFilter) extends DefaultHttpFilters(customFilter)code 但仍然没有将标头添加到响应中。
    • 感谢您的建议。
      我将 CustomFilter 更改为:class CustomFilter @Inject() (implicit val mat: Materializer) extends Filter
      更新了 application.conf 条目 play.http。 filters="utils.Filters"
      class Filters @Inject() (customFilter: CustomFilter) extends DefaultHttpFilters(customFilter)
      但是,标题不会添加到响应中。
    • 感谢您的建议。我将 CustomFilter 更改为: class CustomFilter @Inject() (implicit val mat: Materializer) extends Filter 更新了 application.conf 条目 play.http.filters="utils.Filters" class Filters @Inject() (customFilter: CustomFilter) extends DefaultHttpFilters( customFilter) 但仍然没有将标头添加到响应中。
    • @ShaileshTikhe CustomFilter 必须扩展 Filter 而不是 DefaultHttpFilters
    • @ShaileshTikhe .. 你的 CustomFilter 必须扩展 Filter 而不是 DefaultHttpFilters ... 一切都会正常工作
    【解决方案2】:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2017-09-14
      • 2017-02-27
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多