我的浏览器会向我在play 2.0框架中构建的应用程序发送一些HTTP标头(例如referer)。我完全不知道怎么读它们所以我可以传递它们(谷歌没有帮助)。
我想我可能需要做一些这里提到的事情(http://www.playframework.org/documentation/2.0/ScalaInterceptors)。结果导致:
override def onRouteRequest(request: RequestHeader): Option[Handler] = {
println("headers:" + request.headers.toString)
super.onRouteRequest(request)
}
哪个输出到控制台。但我不知道如何将它们传递给特定的控制器动作。例如,我可以添加if
语句,并在看到特定的“路由”(例如/ client / view / 123)后调用myAction
,否则调用super.onRouteRequest(request)
。但是我的/conf/routing
失去了功能。这样做的“正确”方法是什么?
在我的问题中回答我发现this:Http.Context.current().request()
,但在我的控制器操作中使用了[RuntimeException: There is no HTTP Context available from here.]
。
我发现的另一件事是this,其中Guillaume Bort回复了一个,我认为无关的问题:
I'm not sure what you are trying to do but:
case class CustomRequest(token: String, request: Request[AnyContent])
extends WrappedRequest(request)
case class CustomAction(f: CustomRequest => Result)
extends Action[AnyContent] {
lazy val parser = BodyParsers.parse.anyContent
def apply(req: Request[AnyContent]) = req match {
case r: CustomRequest => f(r)
case _ => sys.error("Invalid usage")
}
}
object Application extends Controller {
def index = CustomAction { request =>
Ok("Token: " + request.token)
}
}
With onRouteRequest:
override def onRouteRequest(req: RequestHeader) = {
super.onRouteRequest(req).map { _ match {
case a: CustomAction => Action { (request: Request[AnyContent]) =>
a(CustomRequest("XXX", request))
}
case o => o
}
}
}
但这有点超过我的头脑(也许甚至不能回答我的问题)。但如果是这样的话,请告诉我。
在控制器操作中读取浏览器发送的HTTP标头的正确/好方法是什么?我只关心/需要几条路线中的HTTP标头。
感谢您的任何指示或推动!
PS: 1)我是scala和play的新手(并通过像框架一样在网上开发),所以我对任何语言错误道歉(告诉你)。 2)stackoverflow的新功能......但它看起来很棒,希望我在这里做的第一个问题一切正常! 3)我有5个链接/发现,但没有声明可以允许,所以将我的问题缩小到3个有趣的webfinds,抱歉。