2016-03-07 16 views
36

Ich bin ein wenig verwirrt über Filter und Interceptor Zwecke.Unterschied zwischen Interceptor und Filter im Frühjahr MVC

Wie ich aus der Dokumentation verstanden habe, wird Interceptor zwischen Anfragen ausgeführt. Auf der anderen Seite wird Filter vor dem Rendern der Ansicht ausgeführt, aber nach der Antwort des Controllers.

Also wo ist der Unterschied zwischen postHandle() in Interceptor und doFilter() in Filter?

Spring MVC sheme Was ist die beste Praxis in welchen Anwendungsfällen sollte es verwendet werden? In diesem Bild wo funktioniert Filter s und Interceptor s?

Antwort

28

Zitiert aus HandlerIntercepter ‚s javadoc:

HandlerInterceptor ist im Grunde ähnlich wie ein Servlet Filter, aber in Gegensatz zu dieser es erlaubt nur individuelle Vorbearbeitung mit der Möglichkeit, das Verbot der Durchführung der Handler selbst und benutzerdefinierte Post-Processing. Filter sind leistungsfähiger, zum Beispiel erlauben sie Austausch der Anfrage und Antwort-Objekte, die über die Kette weitergegeben werden. Beachten Sie, dass ein Filter im Anwendungskontext in web.xml, HandlerInterceptor konfiguriert wird.

als Richtwerte für feinkörnige Handler bezogenen Vorverarbeitung Aufgaben sind Kandidaten für HandlerInterceptor Implementierungen, insbesondere einkalkuliert-out gemeinsame Kontrollen Handler-Code und Autorisierung. Auf der andererseits ist eine Filter gut für den Inhalt der Anfrage geeignet und Anzeigen Content-Handling, wie Multipart-Formulare und GZIP-Komprimierung. Diese zeigt typischerweise, wenn man den Filter auf bestimmte Inhalte (z. B. Bilder) oder auf alle Anfragen abbilden muss.

Mit diesem wird gesagt:

Wo ist der Unterschied zwischen PostHandle() in Interceptor und doFilter() in Filter?

postHandle werden nach dem Aufruf der Prozedurmethode aufgerufen, aber bevor die Ansicht gerendert wird. So können Sie der Ansicht weitere Modellobjekte hinzufügen, aber Sie können nicht die HttpServletResponse ändern, da es bereits festgelegt wurde. doFilter ist viel vielseitiger als die postHandle. Sie können die Anfrage oder Antwort ändern und an die Kette übergeben oder sogar die Anfrageverarbeitung blockieren.

Auch in preHandle und postHandle Methoden haben Sie Zugriff auf die HandlerMethod, die die Anfrage verarbeitet. So können Sie eine Pre-Post-Verarbeitungslogik hinzufügen, die auf dem Handler selbst basiert. Sie können beispielsweise eine Logik für Handlermethoden hinzufügen, die Anmerkungen enthalten.

Was ist die beste Praxis in welchen Anwendungsfällen sollte es verwendet werden?

Wie die Doc sagte, feinkörnig Handler bezogenen Vorverarbeitung Aufgaben sind Kandidaten für HandlerInterceptor Implementierungen, besonders einkalkuliert-out gemeinsamen Handler-Code und Berechtigungsprüfungen. Auf der anderen Seite ist ein Filter gut geeignet für Anfrage Inhalt und Ansicht Content-Handling, wie Multipart-Formulare und GZIP-Komprimierung. Dies zeigt sich typischerweise, wenn der Filter bestimmten Inhaltstypen (z. B. Bildern) oder allen Anforderungen zugeordnet werden muss.

+0

Hinweis, dass ein Filter in web.xml konfiguriert wird, eine HandlerInterceptor im Anwendungskontext ??? Kannst du erklären? –

+0

* Filter * bezieht sich auf die Servlet-API und 'HandlerIntercepter' ist ein Spring-spezifisches Konzept. Um einen Servlet-Filter zu registrieren, können Sie ihn entweder mit der alten 'web.xml' (Servlet 2.5 und ältere Versionen) oder dem neuen programmatischen Ansatz (Servlet 3+) registrieren. Da das 'HandlerIntercepter' nur eine Spring-Abstraktion ist, sollten Sie sich im Kontext des Frühlings registrieren. –

+0

Der Filter bezieht sich auf die Servlet-API und HandlerIntercepter ist ein Spring-spezifisches Konzept. coorect! Aber was auch immer die Registrierung von web.xml ist Teil von 'WebApplication', das ist ein einzelner pro Dispatcher, so dass Servlet und Filter beide mit Kontext verbunden sind, ist es eine gute Übung, Interceptor und Filter mit' rootContext' zuzuordnen, wenn Sie mehrere Dispatcher alle können dasselbe teilen. –

2

Ein HandlerInterceptor bietet Ihnen eine feinere Kontrolle als ein Filter, da Sie Zugriff auf den eigentlichen Ziel- "Handler" haben. Dies bedeutet, dass die von Ihnen ausgeführte Aktion abhängig von der Anfrage variieren kann Filter wird generisch auf alle Anfragen angewendet - nur in der Lage, die Parameter jeder Anfrage zu berücksichtigen. Der HandlerInterceptor bietet auch 3 verschiedene Methoden, so dass Sie das Verhalten vor dem Aufruf eines Handlers anwenden können, nachdem der Handler abgeschlossen wurde, aber vor dem Rendering (wo Sie das View-Rendering sogar umgehen können) oder nachdem die View selbst gerendert wurde. Sie können auch verschiedene Interzeptoren für verschiedene Gruppen von Behandlern einrichten - die Interzeptoren werden auf dem handlerMapping konfiguriert, und es kann mehrere handlerMappings geben.

Wenn Sie etwas völlig Generisches machen müssen (zB alle Anfragen protokollieren), reicht ein Filter aus - wenn das Verhalten jedoch vom Ziel-Handler abhängt oder Sie etwas zwischen der Bearbeitung der Anfrage und der Ansicht machen wollen Rendering, dann bietet der HandlerInterceptor diese Flexibilität.

Referenz: http://static.springframework.org/sp...ng-interceptor

Verwandte Themen