Это "максимальное количество параметров 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>

Если предел превышен, то будут записи в исключении ColdFusion и журнале приложений.