Spring 3.0 HEAD请求

Jan*_*ing 17 spring controller http spring-mvc httprequest

最近我们搬到了Spring 3.0控制器处理,如下所示:

@Controller
public class MyController {
   @RequestMapping(method = RequestMethod.POST)
   protected String onSubmit ( Form form, Errors errors) {
        // handle POST
   }

   @RequestMapping(method = RequestMethod.GET)
   protected void getForm ( Form form ) {
     // handle GET
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,由于HEAD请求,我们在日志中获得了大量异常.

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'HEAD' not supported
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodResolver.resolveHandlerMethod(AnnotationMethodHandlerAdapter.java:621)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:422)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:415)
    ...
Run Code Online (Sandbox Code Playgroud)

我想以与GET请求相同的方式支持HEAD请求,但当然遵守HTTP引用:

HEAD方法与GET相同,只是服务器不能
在响应中返回消息体.响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同.该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身.此方法通常用于测试超文本链接的有效性,可访问性和最近的修改. http://www.ietf.org/rfc/rfc2616.txt

有没有人有一个优雅的解决方案或甚至有一个开箱即用的弹簧解决方案?

我在网上搜索但没有找到任何答案.

小智 21

我相信这就是你要找的东西:http: //www.axelfontaine.com/2009/09/transparently-supporting-http-head.html

  • 5年后,有更优雅的解决方案吗?如在少行添加? (6认同)

Boz*_*zho 14

只需添加HEAD请求映射作为受支持的方法:

@RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD})
Run Code Online (Sandbox Code Playgroud)

更新:我认为你可以提供一个扩展AnnotationMethodHandlerAdapter为方法处理程序(in dispatcher-servlet.xml)的自定义类,并绕过那里的HEAD支持检查.但我只是使用IDE的替换功能来添加它.

  • 当然这会违反规则,即'HEAD方法与GET相同,但服务器不得在响应中返回消息体.'? (2认同)

Jan*_*ing 8

在当前的Spring(4.3.10)中,自动支持HEAD:

映射到"GET"的@RequestMapping方法也隐式映射到"HEAD",即不需要显式声明"HEAD".处理HTTP HEAD请求就像它是HTTP GET一样,除了不写入主体,只计算字节数并设置"Content-Length"标头.

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-requestmapping-head-options