现象:
由于低版本存在安全漏洞,现在升级struts2.5.33后,在web端发送大的表单数据到后台Action时候,请求程序异常,但是没有任何堆栈信息出现,着实困扰人,问题极难排查,没有像spring那样开门见山。
解决:
一、struts2.5.33 新增表单参数限制
默认的单个字段的长度是4096,如果一个字段超过4096就会出现异常了
在struts.xml中新添加
<!-- maxStringLength 为提交表单中 单个字段的长度 -->
<constant name="struts.multipart.maxStringLength" value="2000000"/>
二、原理剖析
1、在2.5.33中新增加了对表单长度的验证
org.apache.struts2.dispatcher.multipart.AbstractMultiPartRequest#setMaxStringLength
@Inject("struts.multipart.maxStringLength")
public void setMaxStringLength(String maxStringLength) {
this.maxStringLength = Long.parseLong(maxStringLength);
}
2、在struts2代码中,对各种拦截器的结果汇总的地方,如果有异常,就会找input视图,一般人不会建立这个视图,然而,这里没有报任何堆栈异常,真实的错误都在
validationAwareAction.hasErrors()
如图所示:
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor#doIntercept