由Spring MVC截断的AJAX请求

时间:2013-07-09 19:29:49

标签: java ajax spring spring-mvc

我试图通过Spring MVC发送一个类型为POST的大型AJAX请求。该请求包含表示在网格中选择的行的ID的数据。请求看起来像这样,其中N大约是30,000:

POST /foo/view? HTTP/1.1
Host: localhost:8443
Connection: keep-alive
Content-Length: 618953
Accept: text/html, */*; q=0.01
Origin: https://localhost:8443
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: https://localhost:8443/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

表单数据包含编码selections

selection=1 selection=2 selection=... selection=n

映射以处理此请求的控制器方法注释如下:

@RequestMapping(method = RequestMethod.POST, value = "/foo/view")
public void controllerMethod(User user, @ModelAttribute CustomModelMap inModel, BindingResult result) {
...
}

其中CustomModelMap只包含访问者/ mutators以将选择映射到集合。

我遇到的问题是,只要我点击控制器,ModelMap就会只填充9,997个选项(当请求包含超过9,997个选项时,它总是这个数字)。我三重检查了我发送的AJAX请求,以确保确实有30,000个选择。

我想也许我的网络服务器不喜欢请求标头中的大量数据,但请求总数大约为600k,而Tomcat默认情况下允许最多2mb用于POST。

关于我还能检查什么的任何想法?

2 个答案:

答案 0 :(得分:1)

如果您正在发出GET请求,那么URL的长度将受到限制,这取决于您的HTTP服务器/应用程序服务器。如果您将此请求更改为表单编码的POST请求并将该信息放入正文中,您可能会避免该问题。

答案 1 :(得分:0)

对于那些感兴趣的人,我花了一些时间在Spring MVC中进行调试,但无法找到我的请求被截断的确切位置。似乎甚至从根Tomcat请求处理程序收到了我的请求的截断版本。很可能有一些网络服务器设置阻止了整个请求的发送。

我的解决方案只是将内容类型更改为JSON,并更改我的请求处理以处理此问题。不理想,但它有效。