gpt4 book ai didi

scala - 如何在 Play Framework 中为 WebSocket 请求添加过滤器

转载 作者:行者123 更新时间:2023-12-01 13:43:11 27 4
gpt4 key购买 nike

使用 Play 2.5.3,我有这个过滤器设置:

@Singleton
class Filters @Inject() (
env: Environment,
postRequestLoggingFilter: PostRequestLoggingFilter) extends HttpFilters {
override val filters = {
Seq(postRequestLoggingFilter)
}
}

这适用于常规的 http Web 请求,但不会触发 WebSocket 路由 (ws://),例如:
class Controller3 @Inject() (implicit system: ActorSystem, materializer: Materializer) extends play.api.mvc.Controller {
def socket = WebSocket.acceptOrResult[String, String] { request =>
...

我如何在我的过滤器中包含这种路由类型,或者是否有其他机制来拦截这种类型的请求?

最佳答案

在花了一些时间研究这个之后,Filter 系统当前的工作方式并不能很好地应用于 WebSocket 请求。

问题是过滤器与应用方法一起使用

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 ,我们有一个 Result ;如果是 Right然后我就通过了 Ok结果。这可以应用于其他过滤器,只要您不介意它们会在 WebSocket 请求之后运行的事实。

关于scala - 如何在 Play Framework 中为 WebSocket 请求添加过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38208251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com