Подтвердить что ты не робот

Spring 3.0 Запросы HEAD

в последнее время мы перешли к обработке 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)
    ...

Я хотел бы поддерживать HEAD-запросы так же, как GET Requests, но, естественно, соблюдая ссылку на HTTP:

Метод HEAD идентичен методу GET за исключением того, что сервер НЕ ДОЛЖЕН верните тело сообщения в ответ. Метаинформация, содержащаяся в заголовки HTTP в ответ на HEAD запрос ДОЛЖЕН быть идентичным информация, отправленная в ответ на GET запрос. Этот метод можно использовать для получения метаинформации о объект, подразумеваемый запросом без передачи сущности-тела сам. Этот метод часто используется для тестирования гипертекстовых ссылок для действительности, доступности и недавних модификация. http://www.ietf.org/rfc/rfc2616.txt

Есть ли у кого-нибудь элегантное решение или есть даже решение spring из коробки?

Я искал в Интернете, но не нашел ответов на это.

4b9b3361

Ответ 1

В текущем Spring (4.3.10) HEAD автоматически поддерживается:

@RequestMapping методы, сопоставленные с "GET", также неявно отображаются в "HEAD", т.е. Нет необходимости явно объявлять "HEAD". Запрос HTTP HEAD обрабатывается, как если бы это был HTTP GET, кроме вместо того, чтобы писать тело, подсчитывается только количество байтов и набор заголовков "Content-Length".

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

Ответ 3

Просто добавьте HEAD в качестве поддерживаемого метода для сопоставления запросов:

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

Обновление. Я думаю, вы можете предоставить собственный класс, который расширяет AnnotationMethodHandlerAdapter, чтобы быть обработчиком метода (в dispatcher-servlet.xml), и просто обойти поддержку поддержки HEAD. Но я бы просто использовал функции замены среды IDE, чтобы добавить ее.