我在Play 2.3中全局启用了SecurityHeadersFilter。
这是我的设置:
play.filters.headers.frameOptions="SAMEORIGIN"
但是如何用X-Frame-Options = GOFORIT而不是SAMEORIGIN覆盖一个动作呢?
答案 0 :(得分:0)
使用动作合成。
首先,创建Action:
import play.libs.F.Promise;
import play.mvc.Action.Simple;
import play.mvc.Http.Context;
import play.mvc.Result;
public class XFrameOptionAction extends Simple {
@Override
public Promise<Result> call(Context ctx) throws Throwable {
ctx.response().setHeader("X-Frame-Options", "GOFORIT");
return delegate.call(ctx);
}
}
然后,在您的控制器中使用它
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.With;
public class MyController extends Controller {
@With(XFrameOptionAction.class)
public static Result index() {
return ok();
}
}
这将为index
的{{1}}操作添加标头。
您还可以将注释放在控制器级别,以使控制器的所有操作都像这样。
如果您想使所有控制器都通用,您需要创建一个控制器,所有控制器都将扩展。
答案 1 :(得分:0)
这是我正在使用的,以避免标题未被SecurityHeadersFilter覆盖。
import play.api.libs.iteratee._
object FilterChainByRequestHeader {
def apply[A](action: EssentialAction, filtersFun: (RequestHeader) => List[EssentialFilter]): EssentialAction = new EssentialAction {
def apply(rh: RequestHeader): Iteratee[Array[Byte], Result] = {
val chain = filtersFun(rh).reverse.foldLeft(action) { (a, i) => i(a) }
chain(rh)
}
}
}
val securityFilter = SecurityHeadersFilter()
val defaultFilters = List(securityFilter)
def filters(rh: RequestHeader) = {
if (rh.path.startsWith("/cors_path"))
defaultFilters.filterNot(_.eq(securityFilter))
else defaultFilters
}
override def doFilter(a: EssentialAction): EssentialAction = {
FilterChainByRequestHeader(super.doFilter(a), filters)
}