13

簡単なシナリオがあります。すべての HTTP 応答に応答ヘッダーを自動的に追加します。Javaでこれをやりたいです。

を見ると、注釈として適用できるアクションsrc/play-filters-helpers/src/main/java/play/filters/*の例があります。すべてのハンドラーに追加することは避けたいです。@AddMyHeader

具体的にScala Filtersを見るsrc/play-filters-helpers/src/main/scala/play/filters/*GzipFilter、明確なメカニズムがわかりますが、Java に推測できるほど Scala に精通していません。

だから:私はここからどこへ行くのですか?

4

3 に答える 3

25

残念ながら、Java からフィルターを作成して使用する良い方法はまだありません。しかし、Scala を使用すると、必要なことを非常に簡単に行うことができます。

app/filters/AddResponseHeader.scala以下を含む新しいファイルを作成します。

package filters

import play.api.mvc._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object AddResponseHeader extends Filter {
  def apply(f: (RequestHeader) => Future[SimpleResult])(rh: RequestHeader): Future[SimpleResult] = {
    val result = f(rh)
    result.map(_.withHeaders("FOO" -> "bar"))
  }
}

app/Global.scalaそして、以下を含む新しいファイルを作成します。

import filters.AddResponseHeader
import play.api.mvc.WithFilters

object Global extends WithFilters(AddResponseHeader)

これにより、すべての応答に新しい応答ヘッダーが適用されます。

更新Global.java:ファイルでこれを使用する方法があります。

@Override
public <T extends EssentialFilter> Class<T>[] filters() {
    return new Class[] {AddResponseHeader.class};
}

また、object AddResponseHeader上記を に変更しclass AddResponseHeaderます。

于 2013-10-11T04:03:14.717 に答える
5

Play フィルターを作成するための便利な Java API はありません。ただし、既存の Scala API を適切な Java テンプレートに適合させることはできます。

例えば:

import play.api.mvc.*;
import scala.Function1;
import scala.concurrent.Future;
import scala.runtime.AbstractFunction1;

public abstract class JavaFilter implements Filter {

@Override
public Future<Result> apply(Function1<RequestHeader, Future<Result>> nextFilter, RequestHeader requestHeader) {
    return nextFilter
            .apply(requestHeader)
            .map(new AbstractFunction1<Result, Result>() {
                     @Override
                     public Result apply(Result currentResult) {
                         return Apply(currentResult, requestHeader);
                     }
                 },
                    play.api.libs.concurrent.Execution.defaultContext());
}

@Override
public EssentialAction apply(EssentialAction next) {
    return Filter$class.apply(this, next);
}

public abstract Result Apply(Result currentResult, RequestHeader requestHeader);
}

実装例:

import play.api.mvc.RequestHeader;
import play.api.mvc.Result;

public class HelloFilter extends JavaFilter {

@Override
public Result Apply(Result currentResult, RequestHeader requestHeader) {
    if (requestHeader.headers().get("X-Filter").isDefined()) {
        ResultAdapter resultAdapter = new ResultAdapter(currentResult);
        return resultAdapter.WithHeader("X-Hello", "World!");
    }
    return currentResult;
  }
}

これがどのように機能するかの詳細については、こちらのブログ投稿を参照してください。

于 2015-04-12T21:35:51.763 に答える