为Play编写自定义过滤器!2.2用Java

Nin*_*ker 13 java playframework

我有一个简单的场景:自动为每个HTTP响应添加一个响应头; 我想用Java做到这一点.

看一下src/play-filters-helpers/src/main/java/play/filters/*,有些动作可以作为注释应用.我想避免添加@AddMyHeader到每个处理程序.

综观斯卡拉过滤器src/play-filters-helpers/src/main/scala/play/filters/*,并GzipFilter具体地讲,我看到一个明确的机制,但我还没有使用Scala熟悉推断为Java.

那么:我从哪里开始?

Jam*_*ard 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"))
  }
}
Run Code Online (Sandbox Code Playgroud)

并创建一个新文件,app/Global.scala其中包含:

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

object Global extends WithFilters(AddResponseHeader)
Run Code Online (Sandbox Code Playgroud)

这应该为每个响应应用一个新的响应头.

更新:有一种方法可以在Global.java文件中使用它:

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

并且还将object AddResponseHeader上面改为class AddResponseHeader.


iva*_*lle 5

没有一个很好的Java API可用于创建Play过滤器.但是,您可以将现有的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);
}
Run Code Online (Sandbox Code Playgroud)

示例实现:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于如何工作的进一步说明,请参见我的博客文章关于它在这里