Scala 如何在Play框架中为WebSocket请求添加过滤器

Scala 如何在Play框架中为WebSocket请求添加过滤器,scala,websocket,playframework-2.0,Scala,Websocket,Playframework 2.0,使用Play 2.5.3,我有以下过滤器设置: @Singleton class Filters @Inject() ( env: Environment, postRequestLoggingFilter: PostRequestLoggingFilter) extends HttpFilters { override val filters = { Seq(postRequestLoggingFilter) } } 这对于常规http web

使用Play 2.5.3,我有以下过滤器设置:

@Singleton
class Filters @Inject() (
    env: Environment,
    postRequestLoggingFilter: PostRequestLoggingFilter) extends HttpFilters {
    override val filters = {
        Seq(postRequestLoggingFilter)
    }
}
这对于常规http web请求非常有效,但不会触发WebSocket路由(ws://),例如:


如何将此路由类型包括在筛选器中,或者是否有另一种机制来拦截此类型的请求?

在花了一些时间研究之后,筛选器系统当前的工作方式不适合应用于WebSocket请求

问题是过滤器使用的apply方法采用

nextFilter: RequestHeader => Future[Result]
其中,作为WebSocket函数的

f: RequestHeader => Future[Either[Result, Flow[In, Out, _]]]
因此,将WebSocket结果传递给过滤器系统实际上不起作用

然而对于我的例子,我主要对日志过滤器感兴趣。因此,作为一种解决方法,我创建了一个自定义版本的
acceptOrResult
,如下所示:

def acceptOrResult[TIn, TOut](f: RequestHeader => Future[Either[Result, Flow[TIn, TOut, _]]])(implicit transformer: MessageFlowTransformer[TIn, TOut], materializer: Materializer, ec: ExecutionContext): WebSocket = {
    WebSocket { request =>
        f(request).map { fResult =>
            PostRequestLoggingFilter.apply(request,fResult.left.getOrElse(Ok))
            fResult.right.map(transformer.transform)
        }
    }
}
我需要将
PostRequestLoggingFilter
中的逻辑分解为它的伴生对象的apply方法,以便上述方法能够正常工作

如果
WebSocket
请求是
Left
,则我们有一个
结果
;如果
正确
则我只需传递一个
确定
结果。这可以应用于其他过滤器,只要您不介意它们将在WebSocket请求之后运行

def acceptOrResult[TIn, TOut](f: RequestHeader => Future[Either[Result, Flow[TIn, TOut, _]]])(implicit transformer: MessageFlowTransformer[TIn, TOut], materializer: Materializer, ec: ExecutionContext): WebSocket = {
    WebSocket { request =>
        f(request).map { fResult =>
            PostRequestLoggingFilter.apply(request,fResult.left.getOrElse(Ok))
            fResult.right.map(transformer.transform)
        }
    }
}