Coldfusion 10允许为POST请求参数的最大数量设置限制(服务器设置/设置/请求大小限制/ POST请求参数的最大数量)。默认限制为100。
是否可以在超出此限制时陷阱,以便可以使用自定义处理程序处理?如果是,如何处理?
我试图在Application.cfc中使用站点范围的错误处理程序和onError()方法来捕获它。两次尝试都没有成功。
感谢您的光临。
答案 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异常和应用程序日志中会有条目。