如何读取浏览器发送的HTTP头在控制器动作中播放?

时间:2012-03-26 14:12:17

标签: scala playframework-2.0

问题文本/背景和发现

我的浏览器会向我在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失去了功能。这样做的“正确”方法是什么?

在我的问题中回答我发现thisHttp.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,抱歉。

1 个答案:

答案 0 :(得分:3)

您可以使用示例here读取标题。

本质:

package controllers

import play.api.mvc._

object Application extends Controller {

  def index = Action {
    request =>
    // your code that reads request.headers here
    Ok("Got request [" + request + "]")
  }

}

您可以使用此example更改回复中的标题。