【问题标题】:How to read the browser HTTP Header sent to play in a controller action?如何读取浏览器发送的 HTTP Header 以在控制器操作中播放?
【发布时间】:2012-04-10 01:15:33
【问题描述】:

问题文本/背景和发现

我的浏览器会向我在 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 的新手(以及通过框架之类的 rails 在 web 上开发),所以我对任何术语错误表示歉意(请告诉我)。 2)stackoverflow的新手......但它看起来很糟糕,希望我在这里的第一个问题一切正常! 3) 我有 5 个链接/发现,但没有声誉允许这样做,所以将我的问题缩小到 3 个有趣的网络发现,抱歉。

【问题讨论】:

  • +1 太糟糕了,似乎没有直接的方法可以通过 onRouteRequest 将数据注入到请求中(是的,WrappedRequest 允许这样做,但是当您需要将变量注入到每个路由的请求中时,不管行动,onRouteRequest 肯定会是一个很好的地方......)
  • 能否请您重述本文顶部的问题?像 TL;DR 我正在尝试做的事情(等等)?很难解析出主要问题是什么。

标签: scala playframework-2.0


【解决方案1】:

您可以使用示例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 更改响应中的标头。

【讨论】:

  • 哇哦,这么简单吧?您提供的代码示例不起作用,但链接中的代码示例起作用了!谢谢指点!
  • 我会修改它,让它现在可以工作我面前有一个 IDE :)
猜你喜欢
  • 1970-01-01
  • 2017-03-07
  • 2013-02-23
  • 2018-03-22
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2015-05-27
  • 2015-12-07
相关资源
最近更新 更多