【问题标题】:Filters not working in play 2.5.X过滤器在播放 2.5.X 中不起作用
【发布时间】:2017-02-27 12:54:46
【问题描述】:

我正在将 play 应用程序从 2.4.6 迁移到 2.5.8。我被困在 play 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(两者都不在根包中) -> 只有Filter有效
2. 仅配置了 RequestHandler(根包中存在过滤器)-> 仅 RequestHandler 有效
3.仅配置过滤器(根包中存在RequestHandler)->仅RequestHandler有效
4. Filter 和 RequestHandler 均未配置(都存在于根包中)-> 只有 RequestHandler 有效

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

【问题讨论】:

  • 您是否尝试过扩展DefaultHttpRequestHandler 而不是HttpRequestHandler
  • @rethab:我修改了RequestHandler 以扩展DefaultHttpRequestHandler,但仍然没有效果。只有RequestHandler 正在工作。它对你有用吗?
  • 我们不在 2.5 上。我建议附加一个调试器。

标签: scala filter playframework playframework-2.0


【解决方案1】:

我认为 RequestHandlerFilter 不能相互配合。
我在 Play 2.5.X 中创建了一个新项目,默认应用了 Filter。我在新项目中添加了RequestHandler 并观察到Filter 停止工作。
ReqestHandlerFilters 肯定应该有一些关系。
如果有人同时使用了RequestHandlerFilter,请说明如何操作。

【讨论】:

    【解决方案2】:

    不是扩展 HttpRequestHandler trait,而是扩展 DefaultHttpRequestHandler 并提供所需的构造函数参数,如下所示,而不是覆盖方法 handlerForRequest

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

    使用它你也可以调用super.handlerForRequest(requestHeader),当你在构造函数中传递HttpFilters时,它会根据你对扩展DefaultHttpFiltersFilters类的实现自动调用所有过滤器。

    【讨论】:

    • @Shailesh 请通过这个实现,这样你就可以同时使用 RequestHandler 和 Filter。
    • 我对此进行了更多探索,并意识到问题不是扩展 HttpRequestHandler。如果你想调用你的过滤器,那么你必须调用它们,这就是 DefaultHttpRequestHandler 所做的(对于新手读者)。可以通过在 RequestHandler 中调用 filterHandler 方法来解决这个问题。以下是我在 handlerForRequest 方法中的最后一个表达式:(request, filterHandler(rh => forbidden)(request))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2011-05-24
    相关资源
    最近更新 更多