【问题标题】:Discarding already set headers on Play Framework 2.x丢弃 Play Framework 2.x 上已设置的标头
【发布时间】:2013-06-26 12:36:14
【问题描述】:

我想“更改”在controllers.Assets.at 上设置的标题。

  • 我想添加一个自定义标签(我可以通过withHeaders 执行此操作,如here 解释)
  • 我想删除之前设置的标签。如Etag

由于.withHeaders 附加或覆盖现有标题,我无法使用它删除。对于 Cookie,有 discardingCookies,但我看不到类似的标题。

由于header: ResponseHeaderval 中的val,因此我无法直接更改其值。

如何在 Play Framework 2.x Scala 中删除已设置的标签?

我正在尝试做的代码示例:

def at(file: String): Action[AnyContent] = CacheForever(Assets.at(assetDistDirectory, file))

def CacheForever[A](action: Action[A]): Action[A] = Action(action.parser) { request =>
  action(request) match {
    case s: SimpleResult[_] => {
      s.withHeaders(
        "mycustomheader" -> "is_set_here"
      )
      s.withOutHeaders("Etag","AnotherTagSetByAssetsAtButIDontWant")   
      // <--- I need something like the above line.
    }
    case result => result
  }
}

【问题讨论】:

    标签: scala playframework playframework-2.1


    【解决方案1】:

    您可以使用withHeaders 中的implementation 并稍作修正:

    val without = Seq("Etag","AnotherTagSetByAssetsAtButIDontWant")
    implicit val writeable: Writeable[A] = s.writeable
    s.copy(header = s.header.copy(headers = s.header.headers -- without) )
    

    使用隐式类:

    implicit class SimpleResultHelper[A](val r: SimpleResult[A]) extends AnyVal {
      def withOutHeaders(without: String*): SimpleResult[A] = {
        import r.writeable
        r.copy(header = r.header.copy(headers = r.header.headers -- without ))
      }
    }
    

    用法:

    val newS = s.withOutHeaders("Etag", "AnotherTagSetByAssetsAtButIDontWant")
    

    SimpleResult 是一个case class,并且在所有case classes 中都有copy 方法。

    字段header 是案例类ResponseHeader 的一个实例,其字段headers 的类型为Map[String, String]

    【讨论】:

    • 我尝试了withHeader with a little correction 方法,但我得到Cannot write an instance of A to HTTP response. Try to define a Writeable[A] 编译错误,现在正试图弄清楚。谢谢。
    • @UmutBenzer:请添加您尝试过的确切代码。如果可能,请尝试使用 implicit class 的版本。
    • @UmutBenzer:我现在无法检查我的代码,所以如果您知道 withHeaders 有效,则尝试将 withHeaders 替换为 withOutHeaders 会更好。
    • @seina 当我将隐式类添加到我的代码中时,我也会得到相同的编译错误。这次来自r.copy 行。即使没有在我的代码的任何地方使用withOutHeaders,我也不会编译。
    • @UmutBenzer:尝试添加implicit val writeable: Writeable[A] = r.writeableimport r.writeable。查看更新。
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多