【问题标题】:Spring 3.0 HEAD RequestsSpring 3.0 HEAD 请求
【发布时间】:2010-09-27 10:37:50
【问题描述】:

最近我们转移到 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

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

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

【问题讨论】:

  • 发出 HEAD 请求的原因是什么?这可能是客户端或客户端代码(Javascript)的错误配置吗?我问是因为通常 HEAD 是为了检查页面的更新(即 Cache-Control / LastModified 标头),因此浏览器可以更新是必要的。
  • PycURL 做一个请求方法 = head 做gets。通常,我发现这对于很多搜索引擎来说是很正常的,比如:oneriot.com、ask.com 等。
  • 谁在乎哪个工具在发出 HEAD 请求。这是一个有效的 HTTP 请求,许多浏览器实际上都在这样做(检查书签或其他)。
  • 根据下面的链接,如果给定的请求 url 不存在,spring 应该提供隐式 HEAD 和 OPTIONS,从 spring 4 开始是真的吗?还是我想念的其他东西? spring docs mvc 是链接。

标签: http spring spring-mvc controller httprequest


【解决方案1】:

【讨论】:

  • 5年后,有没有更优雅的解决方案?要添加的行数更少?
【解决方案2】:

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

@RequestMapping 映射到“GET”的方法也被隐式映射到 “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

【讨论】:

  • 当点击上面的链接时,出于某种原因,我的浏览器会丢弃锚点的“-ann-requestmapping-head-options”部分。如果您也遇到这种情况,您可以在页面上搜索“HTTP HEAD,OPTIONS”并转到相关部分。
  • 链接已修复
  • 此功能自 Spring 4.3.0 起可用这是解决此问题 IMO 最简单的蚂蚁正确方法。
【解决方案3】:

只需在请求映射中添加HEAD 作为支持的方法即可:

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

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

【讨论】:

  • 对不起,我应该提到这个解决方案是已知的。但我不喜欢添加几百次。这不是我所说的“优雅的解决方案”。不过谢谢你的回答。
  • 这肯定会违反规定“HEAD 方法与 GET 相同,只是服务器不得在响应中返回消息体”的规范?
  • @hoipolloi 这取决于您的 Web 容器。例如,Apache Tomcat 会自动删除 HEAD 请求的响应正文。
  • 这是当今的正确答案。如果添加了RequestMethod.HEAD,Spring 会自动处理NoResponseBody
猜你喜欢
  • 2021-07-14
  • 2011-12-11
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2012-05-30
相关资源
最近更新 更多