为游戏编写自定义过滤器!Java中的2.2
我有一个简单的场景:自动为每个HTTP响应添加一个响应头;我想用Java做这个 查看为游戏编写自定义过滤器!Java中的2.2,java,playframework,Java,Playframework,我有一个简单的场景:自动为每个HTTP响应添加一个响应头;我想用Java做这个 查看src/play filters helpers/src/main/java/play/filters/*,有一些示例可以作为注释应用。我希望避免向每个处理程序添加@AddMyHeader 具体地看一下src/play-filters-helpers/src/main/scala/play/filters/*和gzip-filter,我看到了一个清晰的机制,但我对scala还不够熟悉,无法将其推广到Java 那么
src/play filters helpers/src/main/java/play/filters/*
,有一些示例可以作为注释应用。我希望避免向每个处理程序添加@AddMyHeader
具体地看一下src/play-filters-helpers/src/main/scala/play/filters/*
和gzip-filter
,我看到了一个清晰的机制,但我对scala还不够熟悉,无法将其推广到Java
那么:我该怎么办呢?不幸的是,目前还没有一种从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"))
}
}
import filters.AddResponseHeader
import play.api.mvc.WithFilters
object Global extends WithFilters(AddResponseHeader)
并创建一个新文件app/Global.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"))
}
}
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};
}
@覆盖
公共类[]过滤器(){
返回新类[]{AddResponseHeader.Class};
}
还可以将上面的对象AddResponseHeader
更改为类AddResponseHeader
,以添加自定义筛选器(MyFilter.class),并在根包中创建一个Global.java文件。在PlayFramework 2.3.x和Java(JDK8)中测试
导入play.GlobalSettings;
导入play.api.mvc.EssentialFilter;
公共类全局扩展全局设置{
@凌驾
公共类[]过滤器(){
返回新类[]{MyFilter.Class};
}
}
没有一个好的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);
}
要进一步了解它是如何工作的,请参阅我的博客文章尽管我不得不删除我的Global.java,它最终看起来像:
object Global extends with filters(AddResponseHeader,new GzipFilter())
是否有可能将其添加到Global.java
?答案中给出了一种方法。