“最大POST请求参数数量”限制是否可以捕获?

时间:2014-01-21 21:47:46

标签: http post coldfusion coldfusion-10

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

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

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

感谢您的光临。

2 个答案:

答案 0 :(得分:7)

我可以确认你所看到的行为。我认为在调用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>

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

更新1:

进一步阅读建议您还可以更精细地配置内容。要处理特定的kind of exception,请使用<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>

但是,在自定义错误页面上,您可以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>

答案 1 :(得分:0)

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