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