2010-09-27 3 views
16

kürzlich wir so Umgang mit 3.0-Controller zum Frühling bewegt:Frühling 3.0 HEAD Anfragen

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

jetzt wegen HEAD Anfragen bekommen wir viele Ausnahmen in unseren Protokollen.

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) 
    ... 

Ich mag würde HEAD unterstützen Fordert die gleiche Art und Weise wie GET-Anfragen, aber die HTTP-Referenz natürlich gehorchen:

Die HEAD-Methode ist identisch GET, außer dass der Server muss nicht
geben Sie einen Nachrichtentext in der Antwort zurück. Die Metainformation enthalten in die HTTP-Header als Antwort auf eine Anfrage HEAD SOLLTE identisch sein mit der Informationen gesendet als Antwort auf eine Anfrage GET . Dieses Verfahren kann zur Gewinnung von Metainformation über die Entität von der Anforderung implizierte verwendet werden, ohne die Einheit-Körper zu übertragen selbst. Diese Methode wird oft verwendet zum Testen von Hypertext-Links für Gültigkeit, Zugänglichkeit und aktuelle Modifikation. http://www.ietf.org/rfc/rfc2616.txt

Hat jemand eine elegante Lösung hat, oder gibt es sogar eine Feder Lösung out-of-the-box?

Ich suchte im Internet, fand aber keine Antworten darauf.

+0

Was die HEAD-Anfragen macht? Könnte das eine Fehlkonfiguration auf dem Client- oder Client-seitigen Code (Javascript) sein? Ich frage, weil in der Regel HEAD für Aktualisierungen der Seite prüfen soll (das heißt Cache-Control/LastModified Header), so kann der Browser aktualisiert notwendig. – AngerClown

+0

PycURL tut eine Anfrage Methode = Kopf für tun gets. Normalerweise habe ich festgestellt, dass dies sehr normal für viele Suchmaschinen wie: oneriot.com, ask.com etc .. ist. –

+4

Wen kümmert es, welches Werkzeug HEAD Request macht? Es ist eine gültige HTTP-Anfrage und viele Browser tun es tatsächlich (Lesezeichen überprüfen oder was auch immer). – Janning

Antwort

2

In der aktuellen Spring (4.3.10) HEAD wird automatisch unterstützt:

@RequestMapping Methoden gemappt "GET" sind auch implizit auf "HEAD" gemappt, dh es muss kein "HEAD" explizit deklariert werden. Eine HTTP HEAD-Anforderung wird als verarbeitet, wenn es ein HTTP-GET außer anstelle dem Körper nur die Anzahl von Bytes zu schreiben war gezählt und der „Content-Length“ Header gesetzt.

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

12

Fügen Sie einfach HEAD als unterstützte Methode, um die die Anfrage Mapping:

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

Update: Ich denke, man kann eine benutzerdefinierte Klasse bereitzustellen, die AnnotationMethodHandlerAdapter zu sein die Methode Handler (in dispatcher-servlet.xml) erstreckt, und umgehen nur die HEAD Unterstützung dort überprüfen. Aber ich würde nur die Ersetzungsfunktionen einer IDE verwenden, um sie hinzuzufügen.

+0

Entschuldigung, ich hätte erwähnen sollen, dass diese Lösung bereits bekannt ist. Aber ich möchte es nicht ein paar hundert Mal hinzufügen. Dies ist nicht das, was ich als "elegante Lösung" bezeichnet habe. Aber danke für deine Antwort. – Janning

+0

@Janning siehe aktualisiert – Bozho

+1

Sicher würde dies gegen die Spezifikation verstoßen, die besagt: "Die HEAD-Methode ist identisch mit GET, außer dass der Server KEINE Nachricht in der Antwort zurückgeben darf." – hoipolloi