首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >播放2-在所有响应上设置标题?

播放2-在所有响应上设置标题?
EN

Stack Overflow用户
提问于 2012-07-14 07:01:38
回答 4查看 7.7K关注 0票数 18

我从Setting HTTP headers in Play 2.0 (scala)?了解到,您可以通过执行Ok("hello").withHeaders(PRAGMA -> "no-cache")等操作,在逐个案例的基础上设置响应头。

如果您希望在所有操作的响应上设置该标头或几个不同的标头,该怎么办?您不会想要到处重复withHeaders。由于这更像是应用程序范围的配置,您可能不希望操作编写器必须使用不同的语法来获取标头(例如OkWithHeaders(...))

我现在拥有的是一个基本的Controller类,如下所示

代码语言:javascript
复制
class ContextController extends Controller {
 ...
 def Ok(h: Html) = Results.Ok(h).withHeaders(PRAGMA -> "no-cache")
}

但这感觉不太对劲。感觉应该有更多AOP风格的方式来定义缺省头部,并将它们添加到每个响应中。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-30 15:02:11

在您的Global.scala中,将每个调用包装在一个操作中:

代码语言:javascript
复制
import play.api._
import play.api.mvc._
import play.api.Play.current
import play.api.http.HeaderNames._

object Global extends GlobalSettings {

  def NoCache[A](action: Action[A]): Action[A] = Action(action.parser) { request =>
    action(request) match {
      case s: SimpleResult[_] => s.withHeaders(PRAGMA -> "no-cache")
      case result => result
    }
  }

  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    if (Play.isDev) {
      super.onRouteRequest(request).map {
        case action: Action[_] => NoCache(action)
        case other => other
      }
    } else {
      super.onRouteRequest(request)
    }
  }

}

在本例中,我只在dev模式下调用操作,这对无缓存指令最有意义。

票数 8
EN

Stack Overflow用户

发布于 2013-02-15 21:54:39

这个话题现在已经很老了,但是在Play 2.1中,它现在更简单了。您的Global.scala类应该如下所示:

代码语言:javascript
复制
import play.api._
import play.api.mvc._
import play.api.http.HeaderNames._

/**
 * Global application settings.
 */
object Global extends GlobalSettings {

  /**
   * Global action composition.
   */
  override def doFilter(action: EssentialAction): EssentialAction = EssentialAction { request =>
    action.apply(request).map(_.withHeaders(
      PRAGMA -> "no-cache"
    ))
  }
}
票数 14
EN

Stack Overflow用户

发布于 2012-12-15 17:38:36

实现细粒度控制的最简单方法是使用包装的操作。在您的例子中,它可能是这样的:

代码语言:javascript
复制
object HeaderWriter {
    def apply(f: Request[AnyContent] => SimpleResult):Action[AnyContent] = {
        Action { request =>
            f(request).withHeaders(PRAGMA -> "no-cache")
        }
    }
}

并以这种方式使用它:

代码语言:javascript
复制
def doAction = HeaderWriter { request =>
    ... do any stuff your want ...
    Ok("Thats it!")
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11479424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档