web-dev-qa-db-de.com

Unterschied zwischen Interceptor und Filter in Spring MVC

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?

Spring MVC sheme Was ist die beste Vorgehensweise in welchen Anwendungsfällen? In diesem Bild wo funktioniert Filters und Interceptors?

68
rpieniazek

Zitat aus HandlerIntercepter 's javadoc :

HandlerInterceptor ähnelt im Grunde einem Servlet Filter, 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 in web.xml, Einem HandlerInterceptor 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 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.

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.

62
Ali Dehghani

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

3
Satyam

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.

3
Manas