Ich bin ein bisschen verwirrt über Filter
und Interceptor
Zwecke.
Wie ich anhand von Dokumenten verstanden habe, wird Interceptor
zwischen Anforderungen ausgeführt. Auf der anderen Seite wird Filter
vor der Rendering-Ansicht ausgeführt, jedoch nach der vom Controller gerenderten Antwort.
Wo liegt also der Unterschied zwischen postHandle()
in Interceptor und doFilter()
in Filter?
Was ist die beste Vorgehensweise in welchen Anwendungsfällen? In diesem Bild wo funktioniert
Filter
s und Interceptor
s?
Zitat aus HandlerIntercepter
's javadoc :
HandlerInterceptor
ähnelt im Grunde einem ServletFilter
, erlaubt jedoch im Gegensatz zu letzterem nur die benutzerdefinierte Vorverarbeitung mit der Option, die Ausführung des Handlers selbst und die benutzerdefinierte Nachverarbeitung zu verbieten. Filter sind leistungsstärker, zum Beispiel ermöglichen sie den Austausch von Anforderungs- und Antwortobjekten, die über die Kette weitergegeben werden. Beachten Sie, dass ein Filter inweb.xml
, EinemHandlerInterceptor
im Anwendungskontext konfiguriert wird.Als grundlegende Richtlinie sind fein abgestimmte Vorverarbeitungsaufgaben im Zusammenhang mit Handlern Kandidaten für
HandlerInterceptor
-Implementierungen, insbesondere für nicht berücksichtigte allgemeine Code- und Berechtigungsprüfungen für Handler. Andererseits eignet sich einFilter
gut für die Verarbeitung von Anforderungsinhalten und zum Anzeigen von Inhalten, z. B. für mehrteilige Formulare und die GZIP-Komprimierung. Dies zeigt in der Regel, wann der Filter bestimmten Inhaltstypen (z. B. Bildern) oder allen Anforderungen zugeordnet werden muss.
Mit dem Gesagten:
Wo liegt also der Unterschied zwischen PostHandle () in Interceptor und doFilter () in Filter?
postHandle
wird nach dem Aufruf der Handler-Methode, aber vor dem Rendern der Ansicht aufgerufen. Sie können der Ansicht also weitere Modellobjekte hinzufügen, aber Sie können das HttpServletResponse
nicht ändern, da es bereits festgeschrieben wurde. doFilter
ist viel vielseitiger als das postHandle
. Sie können die Anforderung oder Antwort ändern und an die Kette übergeben oder sogar die Anforderungsverarbeitung blockieren.
Außerdem haben Sie in den Methoden preHandle
und postHandle
Zugriff auf die Methode HandlerMethod
, die die Anforderung verarbeitet hat. Sie können also eine Vor-Nachbearbeitungslogik hinzufügen, die auf dem Handler selbst basiert. Beispielsweise können Sie eine Logik für Handlermethoden hinzufügen, die einige Anmerkungen enthalten.
Was ist die beste Vorgehensweise in welchen Anwendungsfällen?
Wie der Doc bereits sagte, sind fein abgestimmte Vorverarbeitungsaufgaben im Zusammenhang mit Handlern Kandidaten für HandlerInterceptor
-Implementierungen, insbesondere für nicht berücksichtigte allgemeine Code- und Berechtigungsprüfungen für Handler. Andererseits eignet sich ein Filter
gut für die Verarbeitung von Anforderungsinhalten und zum Anzeigen von Inhalten, z. B. für mehrteilige Formulare und die GZIP-Komprimierung. Dies zeigt in der Regel, wann der Filter bestimmten Inhaltstypen (z. B. Bildern) oder allen Anforderungen zugeordnet werden muss.
Ein HandlerInterceptor bietet Ihnen eine feinere Steuerung als ein Filter, da Sie Zugriff auf den eigentlichen Ziel- "Handler" haben. Dies bedeutet, dass die von Ihnen ausgeführten Aktionen je nach der tatsächlichen Ausführung der Anforderung variieren können (während der Servlet-Filter generisch angewendet wird auf alle Anfragen - nur in der Lage, die Parameter jeder Anfrage zu berücksichtigen). Der handlerInterceptor bietet außerdem drei verschiedene Methoden, mit denen Sie das Verhalten vor dem Aufrufen eines Handlers, nach Abschluss des Handlers, jedoch vor dem Rendern der Ansicht (wobei Sie das Rendern der Ansicht möglicherweise sogar ganz umgehen) oder nach dem Rendern der Ansicht selbst anwenden können. Sie können auch verschiedene Interceptors für verschiedene Gruppen von Handlern einrichten - die Interceptors sind in der handlerMapping konfiguriert, und es können mehrere handlerMappings vorhanden sein.
Wenn Sie also etwas ganz allgemeines tun müssen (z. B. alle Anforderungen protokollieren), reicht ein Filter aus. Wenn das Verhalten jedoch vom Ziel-Handler abhängt oder Sie etwas zwischen der Verarbeitung von Anforderungen und dem Rendern von Ansichten tun möchten, müssen Sie den HandlerInterceptor bietet diese Flexibilität.
Referenz: http://static.springframework.org/sp...ng-interceptor
Filter: - Ein Filter, wie der Name schon sagt, ist eine Java Klasse, die vom Servlet-Container für jede eingehende HTTP-Anforderung und für jede http-Antwort ausgeführt wird. Auf diese Weise ist dies möglich So verwalten Sie eingehende HTTP-Anforderungen, bevor sie die Ressource erreichen, z. B. eine JSP-Seite, ein Servlet oder eine einfache statische Seite: Ebenso können Sie ausgehende HTTP-Antworten nach der Ressourcenausführung verwalten.
Interceptor: - Spring-Interceptors ähneln Servlet-Filtern, agieren jedoch im Spring-Kontext. Sie sind also leistungsstark für die Verwaltung von HTTP-Anforderungen und -Antworten. Sie können jedoch ein komplexeres Verhalten implementieren, da sie auf den gesamten Spring-Kontext zugreifen können.