Da HandlerIntercepter
's javadoc :
HandlerInterceptor
è sostanzialmente simile a un servlet Filter
, ma a differenza di quest'ultimo consente solo la pre-elaborazione personalizzata con la possibilità di vietare l'esecuzione del gestore stesso e la post-elaborazione personalizzata. I filtri sono più potenti, ad esempio consentono di scambiare gli oggetti richiesta e risposta che vengono trasmessi lungo la catena. Si noti che un filtro viene configurato in web.xml
, a
HandlerInterceptor
nel contesto dell'applicazione.
Come linea guida di base, le attività di pre-elaborazione relative al gestore a grana fine sono candidati per le HandlerInterceptor
implementazioni, in particolare il codice del gestore comune scomposto e i controlli di autorizzazione. D'altra parte, a Filter
è adatto per la gestione del contenuto della richiesta e della visualizzazione, come i moduli multipart e la compressione GZIP. Questo in genere mostra quando è necessario mappare il filtro a determinati tipi di contenuto (ad es. Immagini) oa tutte le richieste.
Detto questo:
Allora dov'è la differenza tra Interceptor#postHandle()
e
Filter#doFilter()
?
postHandle
verrà chiamato dopo l'invocazione del metodo del gestore ma prima che la vista venga renderizzata. Quindi, è possibile aggiungere altri oggetti del modello alla vista, ma si può non cambiare il HttpServletResponse
dal momento che è già impegnata.
doFilter
è molto più versatile del postHandle
. È possibile modificare la richiesta o la risposta e passarla alla catena o addirittura bloccare l'elaborazione della richiesta.
Inoltre, in preHandle
e postHandle
metodi, hai accesso a quello HandlerMethod
che ha elaborato la richiesta. Quindi, puoi aggiungere la logica di pre / post-elaborazione basata sul gestore stesso. Ad esempio, è possibile aggiungere una logica per i metodi del gestore che hanno alcune annotazioni.
Qual è la migliore pratica in quali casi d'uso dovrebbe essere utilizzato?
Come ha detto il documento, le attività di pre-elaborazione relative al gestore a grana fine sono candidati per le HandlerInterceptor
implementazioni, in particolare il codice del gestore comune scomposto e i controlli di autorizzazione. D'altra parte, a Filter
è adatto per la gestione del contenuto della richiesta e della visualizzazione, come i moduli multipart e la compressione GZIP. Questo in genere mostra quando è necessario mappare il filtro a determinati tipi di contenuto (ad es. Immagini) o a tutte le richieste.