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 из коробки?
Я искал в Интернете, но не нашел ответов на это.
Ответы
Ответ 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
Ответ 2
Я считаю, что это то, что вы ищете:
http://www.axelfontaine.com/2009/09/transparently-supporting-http-head.html
Ответ 3
Просто добавьте HEAD
в качестве поддерживаемого метода для сопоставления запросов:
@RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD})
Обновление. Я думаю, вы можете предоставить собственный класс, который расширяет AnnotationMethodHandlerAdapter
, чтобы быть обработчиком метода (в dispatcher-servlet.xml
), и просто обойти поддержку поддержки HEAD. Но я бы просто использовал функции замены среды IDE, чтобы добавить ее.