2016-07-05 7 views
3

が、私はこのフィルタを設定しているプレイFrameworkでのWebSocket要求のためのフィルタを追加しますはどうやってプレイ2.5.3を使用して

class Controller3 @Inject() (implicit system: ActorSystem, materializer: Materializer) extends play.api.mvc.Controller { 
    def socket = WebSocket.acceptOrResult[String, String] { request => 
     ... 

このルートタイプをフィルタに含めるにはどうすればよいですか、またはこのタイプのリクエストを傍受するための別のメカニズムがありますか?

答えて

2

これを見て、フィルタシステムが現在動作している方法は、WebSocket要求に適用されないようになります。

問題はフィルターがWebSocketの機能だから本当に動作しないフィルターシステムを通じてのWebSocket結果を渡す

f: RequestHeader => Future[Either[Result, Flow[In, Out, _]]] 

を取るよう

nextFilter: RequestHeader => Future[Result] 

を取って適用する方法で動作していることです。

私の場合は、主にロギングフィルタに興味がありました。だから、次のように私は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リクエストの後にを実行する気にならない限り、これは他のフィルタにも適用できます。

関連する問題