2016-07-05 37 views
3

使用播放2.5.3,我有這樣的過濾器設置:如何添加過濾器的WebSocket請求在遊戲框架

@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 => 
     ... 

如何將此路由類型包含在我的過濾器中,或者是否存在攔截此類請求的另一種機制?

回答

2

經過一段時間的研究後,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到它的同伴對象的應用方法,這樣上面的程序可以運行。

如果WebSocket要求是Left,我們有一個Result;如果它是Right那麼我只通過一個Ok結果。這可以應用於其他過濾器,只要您不介意他們將在 WebSocket請求之後運行