Michael 的方法对此很有效,但也有一些有趣的事情。如果我过滤查询参数覆盖onRouteRequest
它过滤传递给动作函数的参数,但不过滤请求对象中的查询字符串参数:
def users(shift: Int, limit: Int) = Action { req =>
Logger.debug("shift: " + shift)
Logger.debug("shiftQS: " + req.getQueryString("shift"))
如果我们要求/users?shift=-2
我们的班次将被过滤,而 shiftQS 不会!但是如果你只使用,情况似乎有所不同Filter
,它可以过滤查询字符串参数,但不能过滤你的参数。因此,要过滤查询字符串,您应该添加 Play 的Filter
. 我的最终实现包含如下内容:
// Write your filter and mix it to Global
object SeqFilter extends EssentialFilter {
def apply(next: EssentialAction): EssentialAction = new EssentialAction {
def apply(req: RequestHeader): Iteratee[Array[Byte], SimpleResult] = {
next(doFilter(req))
}
}
def doFilter(req: RequestHeader): RequestHeader = {
if (/* queryString contains invalid parameters */) {
val qs = /* You filtered queryString */
req.copy(queryString = qs)
} else {
req
}
}
}
// Alson use your filter in onRouteRequest in Global object
override def onRouteRequest(req: RequestHeader): Option[Handler] = {
super.onRouteRequest(SeqFilter.doFilter(req))
}