代码之家  ›  专栏  ›  技术社区  ›  Janning Vygen

Spring3.0头请求

  •  17
  • Janning Vygen  · 技术社区  · 14 年前

    最近我们转向了Spring3.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引用:

    但服务器不能
    在响应中返回消息正文。 中包含的元信息 响应头的HTTP头 为响应GET而发送的信息 请求。可以使用这种方法 获取有关 请求所暗示的实体 不转移实体 测试超文本链接 有效性、可访问性和最近的 修改。 http://www.ietf.org/rfc/rfc2616.txt

    有没有人有一个优雅的解决方案,或者甚至有一个现成的spring解决方案?

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

    3 回复  |  直到 7 年前
        1
  •  20
  •   Nino Skilj    13 年前
        2
  •  14
  •   Bozho    14 年前

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

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

    更新:我认为您可以提供一个扩展 AnnotationMethodHandlerAdapter 作为方法处理程序(在 dispatcher-servlet.xml ),绕过头部支撑检查。但我只是使用IDE的replace特性来添加它。

        3
  •  12
  •   Janning Vygen    6 年前

    在当前的弹簧(4.3.10)中,头部会自动支撑:

    @映射到“GET”的RequestMapping方法也隐式映射到 “HEAD”,即不需要显式声明“HEAD”。安 HTTP HEAD请求的处理方式与HTTP GET请求的处理方式相同 只计算字节数,而不是写入正文

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