2

すべての/fooURIに対してBadRequest結果タイプを返したいとしましょう。

override def onBadRequest(r: RequestHeader, error: String) = {
  BadRequest("Bad Request: " + error)
}

override def onRouteRequest(r: RequestHeader): Option[Handler] = {
  if(r.uri.startsWith("/foo") onBadRequest("go away")
  else super.onRouteRequest(r)
}

もちろん、期待されるリターンタイプはOption[play.api.mvc.Handler]

これに対処する慣用的な方法は何ですか?フィルタリングされた不良リクエストを処理するためのデフォルトのアプリケーションコントローラーメソッドを作成しますか?理想的にはonRouteRequest、/ fooが実際にはであることがわかっているので、直接BadRequest呼び出したいと思いonBadRequestます。

これは不自然な例であり、実際にURI yyyyMMdd日付パラメーターを検証しており、JodaTimeインスタンスに解析されない場合はBadRequestを実行しています。基本的には、すべてを処理するのではなく、特定の日付パラメーターをサニタイズするためのキャッチオールフィルターです言うまでもなく、単一のコントローラーメソッド呼び出しは、無駄なスタックトレースでアプリケーションログを乱雑にすることを回避しますre:無効な日付解析変換(ユーザーが有料サブスクライバーを取得しようとしてURI日付を無意味に操作するため、これらのジャンクトレースエントリの数MBが毎日発生しますコンテンツ)

4

1 に答える 1

2

いつものように、エッジは答えられません...

Play ルーターに渡す前に URI 日付パラメーターをサニタイズするためにこれを思いついた

val ymdMatcher = "\\d{8}".r // matcher for yyyyMMdd URI param
val ymdFormat = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd")
def ymd2Date(ymd: String) = ymdFormat.parseDateTime(ymd)

override def onRouteRequest(r: RequestHeader): Option[Handler] = {
  import play.api.i18n.Messages
  ymdMatcher.findFirstIn(r.uri) map{ ymd=>
    try { ymd2Date( ymd); super.onRouteRequest(r) }
    catch { case e:Exception => // kick to "bad" action handler on invalid date 
      Some(controllers.Application.bad(Messages("bad.date.format"))) 
    }
  } getOrElse(super.onRouteRequest(r))
}
于 2012-11-27T20:04:30.593 に答える