I'm aware from Setting HTTP headers in Play 2.0 (scala)? that you can set response headers on a case-by-case basis by doing, for example, Ok("hello").withHeaders(PRAGMA -> "no-cache")
.
What if you want to set that header, or a few different headers, on responses from all your Actions? You wouldn't want to repeat the withHeaders
everywhere. And since this is more like an application-wide configuration, you might not want Action writers to have to use a different syntax to get your headers (e.g. OkWithHeaders(...)
)
What I have now is a base Controller class that looks like
class ContextController extends Controller {
...
def Ok(h: Html) = Results.Ok(h).withHeaders(PRAGMA -> "no-cache")
}
but that doesn't feel quite right. It feels like there should be more of an AOP-style way of defining the default headers and having them added to each response.
The topic is quite old now, but with Play 2.1 it is even simpler now. Your
Global.scala
class should look like this :The easiest way to achieve fine-grained control is in using wrapped actions. In your case it can be something like that:
and use it in such manner:
In your
Global.scala
, wrap every call in an action:In this case, I only call the action in dev mode, which makes most sense for a no-cache instruction.
There are too ways. You can use action-composition. Then you must declare at every Controller that you want set here the header. Another option is to use the GlobalSettings. There are similar solutions for java, too.