【问题标题】:Is the "Maximum number of POST request parameters" limit trappable?“POST 请求参数的最大数量”限制是否可捕获?
【发布时间】:2014-02-11 17:37:56
【问题描述】:

Coldfusion 10 允许为 POST 请求参数的最大数量设置限制(服务器设置/设置/请求大小限制/POST 请求参数的最大数量)。默认限制为 100。

是否可以在超出此限制时进行陷阱,以便可以使用自定义处理程序进行处理?如果可以,如何处理?

我尝试使用站点范围的错误处理程序和 Application.cfc 中的 onError() 方法来捕获它。两次尝试都没有成功。

感谢收看。

【问题讨论】:

  • 您能否发布用于尝试在 OnError 中捕获错误的代码?
  • 我在 onError() 中添加了一个 cflog,以测试在超出限制时是否调用了 onError()。 cflog 没有产生任何东西,所以似乎没有调用 onError()。
  • 查看是否调用了 onError() 的一个好方法是运行带有已知错误的代码。缺少分号通常就足够了。
  • 我可以确认您所看到的。到目前为止,唯一有效的选项是adding a custom error page in WEB-INF\web.xml,使用<error-code>500</error-code>

标签: http post coldfusion coldfusion-10


【解决方案1】:

我可以确认您所看到的行为。我认为在调用 Application.cfc 之前,CF servlet 抛出了异常,这可以解释为什么 onError 永远不会触发。

到目前为止,对我有用的唯一选项是WEB-INF\web.xml 中的adding a custom error page,使用 HTTP 状态代码:

<error-page>
    <error-code>400</error-code>
    <location>/path/to/myErrorPage.cfm</location>
</error-page>

注意:在 cmets 中,@Adrian 提到他将上述内容添加到 \cfusion\runtime\conf\web.xml,而不是 web-inf\ 中的那个。

更新 1:

进一步阅读表明您还可以在更精细的级别上进行配置。要处理特定的kind of exception,请使用&lt;exception-type&gt; 而不是&lt;error-code&gt;。例如:

<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 在 cmets 中指出的那样,该错误与调试设置有关。当 CF 生成“最大数量的 POST 请求参数”消息时,它没有正确考虑调试,进而导致 new 异常:java.lang.IllegalStateException。因此出现 HTTP 500 错误:

当调试被禁用时(就像在生产系统上那样),CF 只是将错误消息直接写入响应流并返回 HTTP 状态代码 400。由于没有抛出异常,&lt;exception-type&gt; 在这里毫无用处。所以你被困在使用状态码:

<error-page>
    <error-code>400</error-code>
    <location>/path/to/myErrorPage.cfm</location>
</error-page>

但是,在自定义错误页面上,您可以extract the error message from the request stream。然后进行相应处理:

  <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>

【讨论】:

  • FYI java.lang.IllegalStateException 似乎与启用调试和日志记录/调试输出设置/启用请求调试输出有关。当它被禁用时,Tomcat 将 500 更改为通用 400 页面。
  • 啊!昨晚我想知道这一点,但没有时间充分调查。只是为了确认,当您禁用调试时,它仍然会跳过站点范围的错误处理程序? (我现在无法测试)
  • 无赖。日志中报告的异常有任何变化 - 还是仍然是 javax.servlet.ServletException?如果它是特定的,那就太好了,所以你可以使用&lt;exception-type&gt;,但我怀疑这太过分了;-)
  • 当 Tomcat 生成 400 页面时,CF 不会记录任何异常,只是在coldfusion-out.log 中记录一条消息。
  • 如果是这样的话,我想你会坚持使用&lt;error-code&gt;400&lt;/error-code&gt;。一个非常快速的搜索表明您可以通过getAttribute('javax.servlet.error.message')getPageContext().getRequest() 中提取错误消息。这将返回“POST 参数超出最大限制”。
【解决方案2】:

如果超出限制,则 ColdFusion 异常和应用程序日志中会有条目。

【讨论】:

  • 不幸的是,这不允许我(轻松)触发自定义错误处理程序。
猜你喜欢
  • 2012-02-24
  • 2018-05-13
  • 1970-01-01
  • 2016-06-06
  • 2010-12-27
  • 2023-03-27
  • 2021-06-17
  • 2023-04-09
  • 2017-01-26
相关资源
最近更新 更多