播放2.3覆盖特定操作的全局SecurityHeadersFilter X-FRAME-OPTIONS

时间:2015-06-01 23:51:18

标签: scala cors playframework-2.3

我在Play 2.3中全局启用了SecurityHeadersFilter。

这是我的设置:

play.filters.headers.frameOptions="SAMEORIGIN"

但是如何用X-Frame-Options = GOFORIT而不是SAMEORIGIN覆盖一个动作呢?

2 个答案:

答案 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)
  }