Spring MVC在Tomcat 6.0.35上使用@RequestParam和RequestMethod.DELETE

Sci*_*cis 8 spring spring-mvc http-delete

我有一个简单的方法(在Tomcat 6.0.35上运行),如下所示:

@RequestMapping(value = "/bla/d", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void d(@RequestParam String d){
    //logic here
}
Run Code Online (Sandbox Code Playgroud)

当我发送一个DELETE请求,其中包含类似参数的帖子(d = gggg在正文中),我得到400 Bad Request.但如果我把它改成

@RequestMapping(value = "/bla/d", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void d(@RequestParam String d){
    //logic here
}
Run Code Online (Sandbox Code Playgroud)

它完美地运作.我正在使用Firefox附加组件来测试它(以及python和Spring的RestTemplate,结果相同)这里的请求是如何看待POST的(a是一个带有参数a的cope粘贴方法):

POST /bla/a HTTP/1.1
Host: ~~~~:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 7
Pragma: no-cache
Cache-Control: no-cache
a=asdas

HTTP/1.1 204 No Content
Server: Apache-Coyote/1.1
Date: Tue, 12 Jun 2012 09:29:46 GMT
Run Code Online (Sandbox Code Playgroud)

删除看起来像:

DELETE /bla/d HTTP/1.1
Host: ~~~~~:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 7
d=asdas

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 971
Date: Tue, 12 Jun 2012 09:30:04 GMT
Connection: close
Run Code Online (Sandbox Code Playgroud)

请帮助我,我可能会错过一些愚蠢的东西,但我只是看不到它.我最初的问题是通过DELETE请求通过类似邮件的主体发送数组,但似乎更基本的东西是错误的.

Sci*_*cis 15

在做了一些研究和调试后,我发现Spring的ServletWebREquest调用了org.apache.catalina.connector.RequestFacade.getParameterValues的getParameterValues,它调用了getParameterValues,其中我找到了以下行(Request.java 2599-2600):

if (!getMethod().equalsIgnoreCase("POST"))
return;
Run Code Online (Sandbox Code Playgroud)

这会杀死任何尝试使用DELETE发送类似POST的参数,这意味着即使RFC 不限制此类使用,Tomcat也会主动限制此用例(虽然它确实说某些现有实现可能会拒绝此类请求,但Tomcat只会抛出它的参数远).是什么让一个人使用Spring和Tomcat并尝试将带有参数的DELETE请求发送给丑陋的解决方案,例如使用@RequestBody获取所有请求体并手动提取它,这使得您想要删除某些地图的某些地方的无辜方法包含请求正文.

@fmucar