2

キャッシュにヒットするのを避けるために、人々がランダムなクエリ パラメータを追加しないようにするため (追加&r=234522.123など)、明示的に処理されないクエリを拒否する方法が必要です。もちろん、ホワイトリストを含むものを作成することもできますが、それは別々に維持する必要があり、同期を維持する必要がある 2 つのものを維持するのは嫌いです。(ただし、失敗を早めるには役立ちます。) これはスプレー ルーティングで可能ですか?

4

3 に答える 3

1

私はこれで終わった:

// This contains a white-list of allowed query parameters. This is useful to
// ensure people don't try to use &r=234234 to bust your caches.
def allowedParameters(params: String*): Directive0 = parameterSeq.flatMap {
  case xs =>
    val illegal = xs.collect {
      case (k, _) if !params.contains(k) => k
    }
    if (illegal.nonEmpty)
      reject(ValidationRejection("Illegal query parameters: " + illegal.mkString("", ", ", "\nAllowed ones are: ") + params.mkString(", ")))
    else
      pass
}

使用法については、単体テストをご覧ください。

val allowedRoute = {
  allowedParameters("foo", "bar") {
    complete("OK")
  }
}

"Allowed Parameter Directive" should "reject parameters not in its whitelist" in {
  Get("/?foo&bar&quux") ~> allowedRoute ~> check {
    handled should equal(false)
    rejection should be(ValidationRejection("Illegal query parameters: quux\nAllowed ones are: foo, bar"))
  }
}

it should "allow properly sorted parameters through" in {
  Get("/?bar&foo") ~> allowedRoute ~> check {
    handled should equal(true)
    responseAs[String] should equal("OK")
  }
}
于 2014-03-11T22:49:09.950 に答える