最近我们搬到了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
有没有人有一个优雅的解决方案,或者甚至有一个开箱即用的弹簧解决方案?
我在网上搜索但没有找到任何答案。
答案 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一样 而不是写身体只计算字节数和 "内容长度"标题集。