2010-09-27 7 views
16

Recentemente abbiamo spostato alla primavera 3.0 controller gestire in questo modo:Primavera 3.0 TESTA Richieste

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

Ora stiamo ricevendo un sacco di eccezioni nei nostri ceppi a causa delle richieste 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) 
    ... 

vorrei sostenere HEAD Richieste allo stesso modo come richieste GET, ma obbedendo il riferimento HTTP, naturalmente:

Il metodo HEAD è identico a GET tranne che il server non deve
restituisce un messaggio-corpo nella risposta. La metainformation contenuta in le intestazioni HTTP in risposta a una richiesta HEAD DOVREBBE essere identica alle informazioni inviate in risposta a una richiesta GET . Questo metodo può essere utilizzato per ottenere la metainformation su l'entità implicita dalla richiesta senza trasferire il corpo dell'entità stesso. Questo metodo viene spesso utilizzato per il test dei collegamenti ipertestuali per la validità di , l'accessibilità e la recente modifica . http://www.ietf.org/rfc/rfc2616.txt

Qualcuno ha una soluzione elegante o c'è anche una soluzione a molla out-of-the-box?

Ho cercato sul Web ma non ho trovato nessuna risposta a questo.

+0

Cosa sta facendo le richieste HEAD? Potrebbe essere una configurazione errata sul client o sul codice lato client (Javascript)? Mi sto chiedendo perché in genere HEAD ha lo scopo di verificare gli aggiornamenti della pagina (ad esempio intestazioni Cache-Control/LastModified) in modo che il browser possa aggiornarsi. – AngerClown

+0

PycURL esegue un metodo request = head per doing ottiene. Di solito, ho trovato che questo è molto normale per i motori di ricerca come: oneriotrienti, ask.com ecc. –

+4

a chi importa quale strumento stia effettuando la richiesta HEAD. È una richiesta HTTP valida e molti browser lo stanno facendo effettivamente (controllando i segnalibri o qualsiasi altra cosa). – Janning

risposta

2

Nell'attuale Primavera (4.3.10) HEAD è supportata automaticamente: metodi

@RequestMapping mappati "GET" sono anche mappato implicitamente a "HEAD", ovvero non è necessario dichiarare esplicitamente "HEAD". Una richiesta HEAD HTTP viene elaborata come se fosse un GET HTTP ad eccezione di anziché scrivere il corpo solo il numero di byte viene contato e l'intestazione "Content-Length" impostata.

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

12

Basta aggiungere HEAD come metodo sostenuto la mappatura richiesta:

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

Aggiornamento: Penso che si possa fornire una classe personalizzata che si estende AnnotationMethodHandlerAdapter essere il gestore di metodo (in dispatcher-servlet.xml), e solo bypassare il Controllo di supporto HEAD lì. Ma vorrei solo usare le funzioni di sostituzione di un IDE per aggiungerlo.

+0

Mi dispiace, avrei dovuto dire che questa soluzione è già nota. Ma non mi piace aggiungerlo alcune centinaia di volte. Questo non è quello che ho definito una "soluzione elegante". Ma grazie per la tua risposta. – Janning

+0

@Janning vedere aggiornato – Bozho

+1

Sicuramente ciò violerebbe le specifiche che indicano "Il metodo HEAD è identico a GET, tranne per il fatto che il server NON DEVE restituire un messaggio nella risposta."? – hoipolloi