你能告诉我表达方式吗
Math.min(params.max ? params.int('max') : 10, 100)
的作品?它不适合常规三元组,那么这个特殊的算子是什么?
由于
答案 0 :(得分:14)
现在是否清楚?
def max = params.max? params.int('max') : 10
Math.min(max, 100)
BTW这是Grails中流行的一个很好的习语 - 如果参数max
存在,请读取它,但如果它超过给定值(默认为100
),则截断它到100
。这样,攻击者或恶意用户就不会让您的应用程序从数据库中返回任意大量的数据。
答案 1 :(得分:8)
也许把它分成两个表达式会有所帮助。 params.max ? params.int('max') : 10
是三元表达式......其结果最终成为Math.min
的第一个arg(100
是另一个arg)。
看起来最终结果是一个限制为最多为100的整数,默认为10.
答案 2 :(得分:0)
在防范攻击时,您可能也想查看底线。我刚刚在grails中遇到过这个问题2.4.4:任何小于1的东西似乎都会返回所有记录。它没有记录,并且源似乎检查值> -1,但我发现我必须检查值> 0:
//Use value, if found, else 20
int max = params.getInt('max') ?: 20
//no less than 1, no more than 100: max < 1 returns ALL records (grails 2.4.4)
max = Math.max(max, 1)
max = Math.min(max, 100)
Domain.list(max: max)