Spring 3.0 HEAD请求

时间:2010-09-27 10:37:50

标签: http spring spring-mvc controller 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
   }
}

现在,由于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)
    ...

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

  

HEAD方法与GET相同   除了服务器必须不是   在响应中返回一个消息体。   元信息包含在   响应HEAD的HTTP头   请求应该与...相同   响应GET而发送的信息   请求。可以使用该方法   获取有关的元信息   请求所暗示的实体   没有转移实体   本身。经常使用这种方法   用于测试超文本链接   有效性,可访问性和最近   修改。   http://www.ietf.org/rfc/rfc2616.txt

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

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

3 个答案:

答案 0 :(得分:21)

答案 1 :(得分:14)

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

@RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD})

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

答案 2 :(得分:5)

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

  

@RequestMapping方法映射到" GET"也隐式映射到   " HEAD",即没有必要拥有" HEAD"明确宣布。一个   处理HTTP HEAD请求就像它是HTTP GET一样   而不是写身体只计算字节数和   "内容长度"标题集。

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