无法发布具有许多(超过 256 个)值的表单

Posted

技术标签:

【中文标题】无法发布具有许多(超过 256 个)值的表单【英文标题】:Can not post form with many (over 256) values 【发布时间】:2015-05-02 21:44:08 【问题描述】:

我正在使用带有 Thymeleaf 的 Spring Boot 1.2.2。 我的问题是我尝试在表单中发布一长串项目(一些标签,一个复选框),这不能执行我列表中的这么多项目。 (我测试了一些小列表,它确实有效。)

首先我使用了jetty,但出现了一个错误,上面写着:

java.lang.IllegalStateException: Form too many keys
at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:526)

我搜索并看到了这个post。结果我添加了

applicationDefaultJvmArgs = ["-Dorg.eclipse.jetty.server.Request.maxFormKeys=8000"]

到我的 gradle.build,但它没有成功。结果我切换到Tomcat,它又失败了。错误信息是:

java.lang.IndexOutOfBoundsException: Index: 256, Size: 256
at java.util.ArrayList.rangeCheck(ArrayList.java:635)

看起来它只能执行 256 个条目。我有大约 500 个条目。所以我认为增加 maxhttpheadersize 会有所帮助,并将这一行添加到我的 application.properties:

server.tomcat.max-http-header-size=-1

(-1 无限制)我在 Thymeleaf 表单中设置了 method="post"。还有其他方法可以增加 256 限制吗?我不想对我的结果进行分页。感谢您的帮助。

【问题讨论】:

只是一个简短的评论。我使用的是 Spring Boot 1.3.3,当我设置 server.tomcat.max-http-header-size=0 它实际上并没有改变配置。单步执行代码,这意味着使用默认值,即 8192。我将其设置为一个较大的值 65536,这样就可以了。 【参考方案1】:

我认为这与 Spring 中的 AutoGrowCollectionLimit 有关,请尝试在您的控制器中包含此代码以增加它:

@InitBinder
public void initBinder(WebDataBinder binder) 
    binder.setAutoGrowCollectionLimit(768);

在 Spring 论坛中查看 this 线程,也在官方文档 here 中。

【讨论】:

以上是关于无法发布具有许多(超过 256 个)值的表单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中提交具有空白或空值和非空白值的表单

许多参数在表单中具有一个名称并在其中获取它们的列表

具有来自函数属性的静态值的 jQuery 发布表单

如何从动态元素发布表单

多值组合框在表单中创建多条记录

在具有值的表单中使用图像作为选项