在play framework 2.x中,如何添加全局动作/过滤器?

时间:2013-12-17 02:40:57

标签: playframework playframework-2.0 locale

更具体地说,我需要允许在url中传递区域设置然后更改区域设置。这应该是一个全局行为,必须在调用任何操作之前发生,以便区域设置更改从当前请求生效。

GlobalSettings.onRequest()尚未绑定Http.Context,据我所知,它没有用于更改该阶段的语言环境的API。

我可以有一个更改语言环境的操作,但我不知道如何将其设置为全局,以便所有请求首先转到该操作,并且我不想注释每个控制器,因为它很容易被遗忘。

我正在使用Play框架2.1.2,任何指针都会受到赞赏。

2 个答案:

答案 0 :(得分:5)

有几种选择。

  1. 您可以注释控制器类并使用Action composition
  2. http://www.playframework.com/documentation/2.1.2/JavaActionsComposition

    1. 使用以下

      覆盖GlobalSettings.onRequest
       @Override
       public Action onRequest(Request request, Method actionMethod) {
           return new Action.Simple() {
              public Result call(Context ctx) throws Throwable {
                **//do your lang changing stuff**
                return delegate.call(ctx);
              }
           };
       }
      

答案 1 :(得分:0)

我不确定您是否使用scala或java。

这是在scala中完成语言字段标题更新的一种方法:

import play.api.mvc.{Headers, Handler, RequestHeader}
import play.api.http.HeaderNames
import play.api.GlobalSettings

object Global extends GlobalSettings {

  val LangQueryString = "lang"

  def updateLanguageHeader(lang: String)(request: RequestHeader) =
    request.copy(
      headers = new Headers {
        val data = (request.headers.toMap + (HeaderNames.ACCEPT_LANGUAGE -> Seq(lang))).toList
      })

  def remLangQueryString(request: RequestHeader) =
    request.copy(
      queryString = request.queryString - LangQueryString)

  def updateLangFromQueryString(request: RequestHeader) =
    request.getQueryString(LangQueryString) match {
      case Some(lang) =>
        (updateLanguageHeader(lang) _ andThen remLangQueryString)(request)
      case _ =>
        request
    }

  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    super.onRouteRequest(updateLangFromQueryString(request))
  }
}