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.
没有一个很好的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)
对于如何工作的进一步说明,请参见我的博客文章关于它在这里