простой простой операторный вопрос: Math.min (params.max? params.int ('max'): 10, 100) - PullRequest
8 голосов
/ 31 июля 2011

Можете ли вы сказать мне, как выражение

Math.min(params.max ? params.int('max') : 10, 100)

работает? Это не подходит к отличной троице, если, так какой же это специальный оператор?

Спасибо

Ответы [ 3 ]

14 голосов
/ 31 июля 2011

Понятно ли сейчас?

def max = params.max? params.int('max') : 10
Math.min(max, 100)

Кстати, это хорошая идиома, популярная в Grails - если параметр max существует, прочитайте его, , но , если он превышает заданное значение(100 по умолчанию), усечь его до 100.Таким образом, злоумышленник или злонамеренный пользователь не заставит ваше приложение возвращать произвольно большой объем данных из базы данных.

8 голосов
/ 31 июля 2011

Возможно, поможет разбить его на два выражения. params.max ? params.int('max') : 10 является троичным выражением ... результатом которого является первый аргумент Math.min (где 100 - другой аргумент).

Похоже, что конечным результатом является целое число, которое не может превышать 100, а по умолчанию равно 10.

0 голосов
/ 02 августа 2015

При защите от атаки вы можете посмотреть также и на нижние границы.Я просто наткнулся на это в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...