在我的操作中执行路由查找

时间:2013-05-30 00:20:15

标签: playframework playframework-2.1

我要做的是在Play 2.1应用程序中构建对CORS的支持。前提是在/ admin路径上的任何内容都需要在响应中获取CORS头。这与我通过StackOverflow拼凑在一起的剪切和粘贴解决方案相得益彰。我的每个Controller操作都利用一个包装的Action,将CORS头部推送到响应中。问题是我的天真实现现在在我的路由文件中不存在的URL的OPTIONS请求上返回200 OK!如何修改我的天真控制器以确认我的路由文件中存在URL,如果我找不到路由,则确认404 Not Found?

CONF /路由

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET     /                           controllers.Application.index
GET     /hb                         controllers.Application.hb

# Admin API
POST    /admin/sessions             controllers.admin.Sessions.session
GET     /admin/apps                 controllers.admin.Apps.index
OPTIONS /admin/*url                 controllers.admin.Admin.options(url: String)

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)

我的管理控制器提供常用选项处理

object Admin extends Controller {
  val log = LoggerFactory.getLogger(getClass())

  def options(url: String) = CORS_Writer {
    Action {
      log.trace("options( url: {}", url);
      /*
       * I need to validate that url exists in the routes file here
       * (this doesn't compile, but conceptually is what I want).
       */
       if(routes(url)) { Ok } else { NotFound }
    }
  }
}

我希望

OPTIONS /admin/sessions HTTP/1.1
HTTP/1.1 200 OK

OPTIONS /admin/sessions HTTP/1.1
HTTP/1.1 200 OK

OPTIONS /admin/bob HTTP/1.1
HTTP/1.1 404 Not Found

我是Scala和Play的新手,我发现Play 2.1文档对于使用路由的细节非常缺乏。如果这个问题看起来相当简单,请原谅。我确信这是可能的,我只是不知道咒语。

1 个答案:

答案 0 :(得分:0)

常见的onHandlerNotFound不够好吗?

对于以/admin/开头的路径,您可以针对不同的错误进行额外的检查。