2017-02-14 5 views
0

the official document,このロギングフィルタを見ました。再生用簡易ロギングフィルタ

import java.util.concurrent.CompletionStage; import java.util.function.Function; import javax.inject.Inject; import akka.stream.Materializer; import play.Logger; import play.mvc.*; 

public class LoggingFilter extends Filter { 

    @Inject 
    public LoggingFilter(Materializer mat) { 
     super(mat); 
    } 

    @Override 
    public CompletionStage<Result> apply(
      Function<Http.RequestHeader, CompletionStage<Result>> nextFilter, 
      Http.RequestHeader requestHeader) { 
     long startTime = System.currentTimeMillis(); 
     return nextFilter.apply(requestHeader).thenApply(result -> { 
      long endTime = System.currentTimeMillis(); 
      long requestTime = endTime - startTime; 

      Logger.info("{} {} took {}ms and returned {}", 
       requestHeader.method(), requestHeader.uri(), requestTime, result.status()); 

      return result.withHeader("Request-Time", "" + requestTime); 
     }); 
    } } 

これは基本的な質問ですが、このフィルタの設定を行う必要はありませんか? PlayApplicationでこのフィルタクラスを作成した後、このフィルタはすべてのリクエストに適用できますか?

次に、nextFilterが次の動作であると説明します。しかし、ここには何も設定されていないようです。したがって、この場合、どのようなアクションが実行されますか?

誰でも説明できますか?

答えて

0

FiltersクラスをDefaultHttpFiltersに拡張して作成し、フィルタをvarargsコンストラクタに渡します。 Playは自動的にこのFiltersクラスを調べ、作成したフィルタを見つけます。フィルタはすべてのリクエストで利用できます。あなたはいくつかのフィルタを定義して適用することができます

import play.http.DefaultHttpFilters; 
import javax.inject.Inject; 

public class Filters extends DefaultHttpFilters { 
    @Inject 
    public Filters(LoggingFilter logging) { 
    super(logging); 
    } 
} 

:この場合

public class Filters extends DefaultHttpFilters { 
    @Inject 
    public Filters(GzipFilter gzip, LoggingFilter logging) { 
    super(gzip, logging); 
    } 
} 

を、nextFilterパラメータは、フィルター・チェーン内の次のアクションを表します。