2010-09-27 3 views
16

récemment nous sommes passés au printemps 3.0 contrôleur de manutention comme ceci:Spring 3.0 HEAD Demande

@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 
    } 
} 

Maintenant, nous recevons beaucoup d'exceptions dans nos journaux en raison des demandes de 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) 
    ... 

Je voudrais soutenir HEAD demande la même façon que les requêtes GET, mais obéissant à la référence HTTP bien sûr:

La méthode HEAD est identique à GET sauf que le serveur NE DOIT PAS
renvoie un corps de message dans la réponse. La métainformation contenue dans les en-têtes HTTP en réponse à une demande HEAD DEVRAIENT être identiques aux informations envoyées en réponse à une demande GET . Cette méthode peut être utilisée pour obtenir métainformation environ l'entité impliquée par la demande sans transférer le corps entité lui-même. Cette méthode est souvent utilisée pour tester les liens hypertextes pour la validité, l'accessibilité et la modification récente . http://www.ietf.org/rfc/rfc2616.txt

Est-ce que quelqu'un a une solution élégante ou est-il même une solution de ressort hors-the-box? J'ai cherché sur le web, mais je n'ai trouvé aucune réponse à cela.

+0

Qu'est-ce qui fait les demandes HEAD? Serait-ce une mauvaise configuration sur le client ou le code côté client (Javascript)? Je demande parce que généralement HEAD est destiné à vérifier les mises à jour de la page (c'est-à-dire les en-têtes Cache-Control/LastModified) afin que le navigateur puisse mettre à jour est nécessaire. – AngerClown

+0

PycURL fait une requête méthode = head pour faire gets. Habituellement, j'ai trouvé que c'est très normal pour les moteurs de recherche tels que: oneriot.com, ask.com etc. –

+4

qui se soucie quel outil fait la demande de HEAD. C'est une requête HTTP valide et de nombreux navigateurs la font réellement (en vérifiant des signets ou autre). – Janning

Répondre

2

Au printemps actuelle (4.3.10) tête est automatiquement pris en charge:

méthodes de @RequestMapping mis en correspondance "GET" sont aussi implicitement mappé à "HEAD", c'est-à-dire qu'il n'est pas nécessaire d'avoir "HEAD" explicitement déclaré. Une requête HTTP HEAD est traitée comme s'il s'agissait d'un HTTP GET sauf au lieu d'écrire le corps seul compte le nombre d'octets et le jeu d'en-têtes "Content-Length".

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

12

Il suffit d'ajouter HEAD comme méthode prise en charge du mappage de la demande:

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

Mise à jour: Je pense que vous pouvez fournir une classe personnalisée qui étend AnnotationMethodHandlerAdapter être le gestionnaire de la méthode (en dispatcher-servlet.xml), et juste contourner la Le support HEAD vérifie là. Mais j'utiliserais simplement les fonctionnalités de remplacement d'un IDE pour l'ajouter.

+0

Désolé, j'aurais dû mentionner que cette solution est déjà connue. Mais je n'aime pas l'ajouter quelques centaines de fois. Ce n'est pas ce que j'ai appelé une «solution élégante». Mais merci pour votre réponse. – Janning

+0

@Janning voir mis à jour – Bozho

+1

Sûrement, cela violerait la spécification selon laquelle la méthode HEAD est identique à celle de GET, sauf que le serveur NE DOIT PAS retourner un corps de message dans la réponse. '? – hoipolloi

Questions connexes