Это "максимальное количество параметров POST запроса" лимит перехватываемая?
Coldfusion 10 позволяет установить ограничение для максимального количества параметров запроса POST (настройки сервера / настройки / ограничения размера запроса / максимальное количество параметров запроса POST). Лимит по умолчанию-100.
можно ли ловить, когда этот предел превышен, чтобы его можно было обрабатывать с помощью пользовательского обработчика? если да, то как?
Я попытался поймать его с помощью обработчика ошибок сайта и метода onError () в приложении.фреон. Ни одна из попыток не увенчалась успехом.
Спасибо за просмотр.
2 ответов
я могу подтвердить, что поведение вы видите. Я!--15-->думаю исключение создается сервлетом CF перед приложением.вызывается cfc, что объясняет, почему onError
никогда не пожаров.
пока единственный вариант, который работал для меня добавление пользовательской страницы ошибок на WEB-INF\web.xml
, используя код состояния HTTP:
<error-page>
<error-code>400</error-code>
<location>/path/to/myErrorPage.cfm</location>
</error-page>
Примечание: из комментариев @Adrian упомянул, что он добавил выше к \cfusion\runtime\conf\web.xml
, а не один в web-inf\
.
обновление 1:
дальнейшее чтение предполагает, что вы также можете настроить вещи на более детализированном уровне. Для обработки конкретного рода исключение используйте <exception-type>
вместо <error-code>
. Например:
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/path/to/myErrorPage.cfm</location>
</error-page>
тем не менее, в моем (кратком) тесте CF10, похоже, использовал очень общие классы исключений для этой ошибки. Оба из которых имеют много потенциальных причин, а не просто слишком много полей формы. Так что имейте это в виду. Конечно, он немного более сфокусирован, чем обработка всех ошибок HTTP 500, но он также может охватывать и другие причины.
javax.servlet.ServletException: ROOT CAUSE: java.lang.IllegalStateException: Cannot call sendError() ..
обновление 2:
получается javax.servlet.ServletException
был просто отвлекающий маневр. Как отметил @AdrianWright в комментариях, эта ошибка связана с настройками отладки. Когда CF генерирует сообщение" максимальное количество параметров запроса POST", это не правильно учитывать отладку, которая в свою очередь вызывает новая исключения: java.lang.IllegalStateException
. Следовательно, ошибка HTTP 500:
когда отладка отключена (как это было бы в производственной системе), CF просто записывает сообщение об ошибке непосредственно в поток ответов и возвращает код состояния HTTP 400. Поскольку исключение не создается,<exception-type>
здесь бесполезны. Таким образом, вы застряли с использованием кода состояния:
<error-page>
<error-code>400</error-code>
<location>/path/to/myErrorPage.cfm</location>
</error-page>
однако на странице пользовательской ошибки вы можете экстракт сообщение об ошибке из потока запросов. Тогда обращайтесь с ним соответственно:
<cfset req = getPageContext().getRequest()>
<cfset message = req.getAttribute("javax.servlet.error.message")>
<cfif message contains "POST parameters exceeds">
Too many form fields. do something...
<cfelse>
Some other cause. do something else
</cfif>