为Unfiltered中的所有请求添加默认标头

时间:2015-01-23 09:30:36

标签: jetty unfiltered

我们有未经过滤的底层Jetty服务器(不确定,但我相信Unfiltered使用Jetty 8)。现在我们需要为我们返回的所有响应添加标头条目。

我可以获得底层Jetty Server并尝试直接添加Handler。不确定我是否犯了一些愚蠢的错误,或者Unfiltered做了什么,因为我设法添加了这个标题,但同时我删除了所有其他功能。不好:)

我也找到了在jetty.xml中执行此操作的方法,但是没有这样做。

现在尝试使用Cycle.Intent,但在将两个类型添加到Plan时遇到类型问题。

object AllowOrigin {
  case class AllowOriginResponseFunctionWrapper[A](req: HttpRequest[A], f: ResponseFunction[Any]) extends ResponseFunction[Any] {
    def apply[T](res: HttpResponse[T]) = req match {
      case _ =>
        val resp = f(res)
        resp.header("Access-Control-Allow-Origin", "*")
        resp
    }
  }

  def apply[A](inner: Cycle.Intent[A,Any]): Cycle.Intent[A,Any] = {
    case req @ _ => {
      inner.orElse({ case _ => Pass }: Cycle.Intent[A,Any])(req) match {
        case Pass => Pass
        case responseFunction => AllowOriginResponseFunctionWrapper(req, responseFunction)
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

我想出了如何在不破坏现有功能的情况下做到这一点。不幸的是,我必须为我所拥有的每个计划添加代码,但无论如何都会有很小的变化。

首先定义意图。

object AllowAllOrigin extends unfiltered.kit.Prepend {
  def intent = Cycle.Intent {
    case _ ⇒ ResponseHeader("Access-Control-Allow-Origin", Set("*"))
  }
}

然后将其添加到计划意图中,如果在计划特定内容之前有两件事要做,只需添加更多内容。

def intent = AllowAllOrigin { Authentication(config) {
  case _ => Ok // or perhaps something more clever here :)
}}