我们有未经过滤的底层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)
}
}
}
}
答案 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 :)
}}