过滤器不起作用2.5.X

时间:2016-10-18 09:53:11

标签: scala filter playframework playframework-2.0

我正在将播放应用程序从2.4.6迁移到2.5.8。我坚持在游戏2.5.X中使用过滤器 我创建了RequestHandler来验证请求和过滤器,它们应该对所有响应应用过滤器。

以下是我在application.conf中的条目

play.http.requestHandler="utils.RequestHandler"
play.http.filters="utils.Filters"

以下是我的Filter.scala:

@Singleton
class Filters @Inject() (customFilter: CustomFilter) extends DefaultHttpFilters(customFilter)

@Singleton
class CustomFilter @Inject() (implicit val mat: Materializer) extends Filter {
  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 = { /* CODE */}
}

以下是我的RequestHandler.scala

@Singleton
class RequestHandler @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*/
}

我可以运行播放应用程序,但过滤器不起作用(RequestHandler正常工作)。

当我从application.conf评论 play.http.requestHandler =“utils.RequestHandler”时,过滤器开始工作。

我尝试了更多,并观察到RequestHandler和Filters中只有一个一次工作 以下是我的观察:
1.配置Filter和RequestHandler(两者都不在root包中) - >只有过滤器工作
2.仅配置RequestHandler(过滤器存在于根包中) - >只有RequestHandler才能工作 3.仅配置过滤器(根包中存在RequestHandler) - >只有RequestHandler才能工作 4.没有配置Filter和RequestHandler(两者都存在于根包中) - >只有RequestHandler工作

注意:已配置表示我在application.conf中有条目 我想知道我在这里缺少什么。

2 个答案:

答案 0 :(得分:2)

我认为FilterFilter并不相互合作 我在Play 2.5.X中创建了一个新项目,默认情况下应用RequestHandler。我在新项目中添加了Filter,发现ReqestHandler已停止工作 绝对应该在FiltersRequestHandler中存在某种关系 如果某人有Filter和{{1}}工作,请解释如何。

答案 1 :(得分:2)

代替扩展HttpRequestHandler特性,扩展DefaultHttpRequestHandler并提供所需的构造函数参数,如下所示,并覆盖方法handlerForRequest

class RequestHandler @Inject() (router: Router,
                                errorHandler: HttpErrorHandler,
                                configuration: HttpConfiguration,
                                filters: HttpFilters) 
    extends DefaultHttpRequestHandler(router , errorHandler, configuration, filters) 

使用此方法,您还可以调用super.handlerForRequest(requestHeader),并在构造函数中通过HttpFilters时,它将根据扩展{{1}的Filters类的实现自动调用所有过滤器}。