Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Dies ist ein von KI übersetzter Beitrag.

제이온

[Spring] Was sind Filter, Interceptor und Argument Resolver?

  • Schreibsprache: Koreanisch
  • Referenzland: Alle Länder country-flag

Sprache auswählen

  • Deutsch
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

Von durumis AI zusammengefasster Text

  • Filter sind eine J2EE-Standardfunktionalität, die die Fähigkeit bietet, zusätzliche Aufgaben für alle Anforderungen an ein bestimmtes URL-Muster zu verarbeiten, bevor oder nachdem eine Anfrage an den Dispatcher Servlet weitergeleitet wird. Sie laufen im Webcontainer. Interceptoren sind eine von Spring bereitgestellte Technologie, die die Möglichkeit bietet, Anfragen und Antworten zu referenzieren oder zu verarbeiten, bevor der Dispatcher Servlet den Controller aufruft, und nach dem Aufruf. Sie laufen im Spring-Kontext.
  • Argument Resolver können indirekt dazu beitragen, gewünschte Objekte aus den Werten zu erstellen, die in einer Anfrage an einen Controller eingehen.
  • Filter und Interceptoren unterscheiden sich darin, ob sie im Spring-Container oder im Webcontainer laufen, ob sie Anfragen relativ zum Dispatcher Servlet oder zum Controller verarbeiten. Argument Resolver laufen nach Interceptoren und geben ein bestimmtes Objekt zurück.

Was ist ein Filter?

Ein Filter ist eine Funktion der J2EE-Standardspezifikation, mit der zusätzliche Aufgaben für alle Anforderungen behandelt werden können, die mit einem URL-Muster übereinstimmen, bevor oder nachdem eine Anforderung an das Dispatcher-Servlet weitergeleitet wird. Mit anderen Worten, es wird vom Webcontainer (wie Tomcat) und nicht vom Spring-Container verwaltet, sodass die Anforderung vor dem Erreichen des Dispatcher-Servlets verarbeitet wird.



Filterimplementierung

Um einen Filter hinzuzufügen, müssen Sie die Filter-Schnittstelle von javax.servlet implementieren. Diese enthält die folgenden drei Methoden:


  • init-Methode
    • Dies ist eine Methode zum Initialisieren eines Filterobjekts und zum Hinzufügen zum Service. Wenn der Webcontainer die init-Methode einmal aufruft, um das Filterobjekt zu initialisieren, werden spätere Anfragen über die doFilter()-Methode verarbeitet.
  • doFilter-Methode
    • Diese Methode wird vom Webcontainer ausgeführt, bevor jede HTTP-Anforderung, die mit dem URL-Muster übereinstimmt, an das Dispatcher-Servlet weitergeleitet wird. Sie wird auch vom Dispatcher-Servlet ausgeführt, bevor die HTTP-Antwort an den Client gesendet wird.
      Die doFilter()-Methode enthält einen FilterChain-Parameter. Durch Aufrufen von doFilter() auf FilterChain wird die Anforderung an das nächste Ziel weitergeleitet. Durch Hinzufügen des gewünschten Verarbeitungsablaufs vor und nach chain.doFilter() können Sie die gewünschte Verarbeitung durchführen.
  • destory-Methode
    • Dies ist eine Methode zum Entfernen des Filterobjekts aus dem Dienst und zum Zurückgeben verwendeter Ressourcen. Dies wird vom Webcontainer einmal aufgerufen. Danach wird die Anforderung nicht mehr von doFilter() verarbeitet.


Beispielcode - Servlet-Spezifikation

@WebFilter("/*")
public class dolphagoFilter implements Filter {

    @Override
      public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
      public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain filterChain) throws IOException, ServletException {
        //Vorverarbeitung hier
        request.setCharacterEncoding("UTF-8");
        System.out.println("Vor doFilter()....");

        filterChain.doFilter(request, response);

        //Nachverarbeitung hier
        System.out.println("Nach doFilter()....");
      }

    @Override
      public void destroy() {    }


Beispielcode - @Component

@Order(1)
@Component
public class CustomFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() { }


  • @Component: Filter kann als Spring Bean registriert werden.
  • @Order: Wenn mehrere Filter vorhanden sind, können Sie die Reihenfolge festlegen.
  • Wenn Sie einen Filter registrieren, der der Servlet-Spezifikation entspricht, als Spring Bean, können Sie andere Beans verwenden, die der Spring-Spezifikation entsprechen.


Beispielcode - @Configuration

@Configuration
public class CustomRegistrationBean {

    @Bean
    public FilterRegistrationBean customFilterBean() {
        FilterRegistrationBean registration = new FilterRegistrationBean<>();
        registration.setFilter(new CustomFilter());
        registration.setOrder(1);
        registration.addUrlPatterns("/api/*");
        return registration;
    }

Wenn Sie möchten, dass der Filter nur für bestimmte URIs funktioniert, können Sie den Filter als Spring Bean registrieren, indem Sie FilterRegistrationBean verwenden.


Filterverwendung

Filter sind in erster Linie für die Validierung und Verarbeitung von Anforderungsparametern verantwortlich.


  • Gemeinsame Aufgaben im Zusammenhang mit der Sicherheit
    • Da der Filter im Webcontainer ausgeführt wird, können Sie Sicherheitsüberprüfungen (z. B. XSS, CSRF-Abwehr) durchführen und ungültige Anfragen blockieren. Da die Anforderung den Spring-Container nicht erreicht, wird die Sicherheit erhöht.
  • Protokollieren aller Anforderungen
  • Komprimieren von Bildern/Daten und Codieren von Zeichenfolgen
    • Filter haben Funktionen wie Komprimieren von Bildern oder Daten oder Codieren von Zeichenfolgen implementiert, die in der gesamten Webanwendung verwendet werden.
  • Anpassen von ServletRequest
    • HttpServletRequest kann den Inhalt des Körpers nur einmal lesen. Daher können Filter oder Interceptor den Körper nicht lesen. Sie können einen benutzerdefinierten ServletRequest erstellen, um den Körper zu protokollieren.


Interceptor

Was ist ein Interceptor?

Interceptor unterscheidet sich von dem J2EE-Standard-Filter und ist eine Spring-Technologie, die es ermöglicht, Anforderungen und Antworten zu referenzieren oder zu bearbeiten, bevor oder nachdem das Dispatcher-Servlet den Controller aufruft. Mit anderen Worten, im Gegensatz zu Filtern, die im Webcontainer ausgeführt werden, werden Interceptor im Spring-Kontext ausgeführt.


Das Dispatcher-Servlet fordert die Suche nach einem geeigneten Controller über Handler Mapping an, was zu einer Ausführungskette (HandlerExecutionChain) führt. Wenn diese Ausführungskette einen oder mehrere registrierte Interceptor enthält, werden die Interceptor nacheinander durchlaufen, bevor der Controller ausgeführt wird. Wenn keine Interceptor vorhanden sind, wird der Controller direkt ausgeführt.


Interceptor-Implementierung

Um einen Interceptor hinzuzufügen, müssen Sie die org.springframework.web.servlet.HandlerInterceptor-Schnittstelle implementieren. Diese enthält die folgenden drei Methoden:


  • preHandle-Methode
    • Die preHandle-Methode wird ausgeführt, bevor der Controller aufgerufen wird. Daher kann sie zum Ausführen von Vorverarbeitungsschritten, zum Bearbeiten von Anforderungsinformationen oder zum Hinzufügen von Informationen verwendet werden, die vor dem Controller verarbeitet werden müssen.
    • Der dritte Parameter der preHandle-Methode, der handler-Parameter, ist ein Objekt, das die Informationen der mit @RequestMapping annotierten Methode abstrahiert.
    • Der Rückgabetyp der preHandle-Methode ist boolean. Wenn der Rückgabewert true ist, wird der Vorgang fortgesetzt. Wenn der Wert false ist, wird der Vorgang abgebrochen und die folgenden Schritte (der nächste Interceptor oder Controller) werden nicht ausgeführt.
  • postHandle-Methode
    • Die postHandle-Methode wird ausgeführt, nachdem der Controller aufgerufen wurde. Daher kann sie zum Ausführen von Nachverarbeitungsschritten verwendet werden, die nach dem Controller ausgeführt werden müssen.
  • afterCompletion-Methode
    • Wie der Name schon sagt, wird die afterCompletion-Methode ausgeführt, nachdem alle Aufgaben abgeschlossen wurden, einschließlich der Erstellung des endgültigen Ergebnisses durch alle Ansichten.


Beispielcode

@Component
public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    }
}

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor());
        registry.addInterceptor(new LoggingInterceptor());
    }


  • Der erstellte Interceptor wird als Bean registriert.
  • Der erstellte Interceptor wird in der addInterceptors()-Methode der WebMvcConfigurer-Schnittstelle registriert.
  • Interceptor werden in der Reihenfolge ausgeführt, in der sie in InterceptorRegistry registriert wurden.


Interceptor-Verwendung

Interceptor sind in erster Linie für die Verarbeitung der Integrität von Anforderungsinformationen unter Verwendung der Servicelogik verantwortlich.


  • Gemeinsame Aufgaben wie Authentifizierung/Autorisierung
    • Beispiele hierfür sind Authentifizierung und Autorisierung. Aufgaben im Zusammenhang mit Client-Anforderungen können vor der Weiterleitung an den Controller überprüft werden.
  • Protokollieren von API-Aufrufen
    • Sie können die Informationen des Clients über die übermittelten Objekte HttpServletRequest und HttpServletResponse protokollieren.
  • Verarbeitung von Daten, die an den Controller übergeben werden
    • Sie können die empfangenen Objekte HttpServletRequest und HttpServletResponse verarbeiten und an den Controller übergeben.
  • AOP-Nachahmung
    • Sie können den HandlerMethod des dritten Parameters der preHandle()-Methode verwenden, um die Signatur der auszuführenden Methode und weitere Informationen zu ermitteln und so die Ausführungslogik zu bestimmen.


Filter vs. Interceptor

  • Filter werden im Webkontext ausgeführt, während Interceptor im Spring-Kontext ausgeführt werden, daher unterscheiden sie sich im Ausführungszeitpunkt.
  • Filter können vor und nach dem Dispatcher-Servlet verwendet werden, während Interceptor vor und nach dem Controller verwendet werden können.
  • Filter sollten verwendet werden, wenn Aufgaben ausgeführt werden müssen, die unabhängig von Spring sind, die Validierung von eingehenden Parametern selbst durchgeführt werden muss oder wenn anstelle von HttpServletRequest ServletRequest verwendet werden soll.
  • Interceptor sollten verwendet werden, wenn Aufgaben ausgeführt werden müssen, die sich auf die Anforderung des Clients beziehen, die global innerhalb von Spring verarbeitet werden müssen, oder wenn Servicelogik einbezogen werden muss.
  • Interceptor können @ControllerAdvice und @ExceptionHandler verwenden, um Fehler zu behandeln, aber Filter können diese nicht verwenden, um Fehler zu behandeln.
    • Filter behandeln in der Regel Fehler, die zum Zeitpunkt der Fehlerbehandlung in der doFilter()-Methode auftreten, indem sie die Methode in einen try~catch-Block einschließen.


Argument Resolver

Was ist ein Argument Resolver?

Argument Resolver ist eine Funktion, die Ihnen indirekt helfen kann, das gewünschte Objekt zu erstellen, wenn eine Anforderung in den Controller gelangt, basierend auf dem Wert, der mit der Anforderung eingegangen ist.


Argument Resolver-Verwendung

Nehmen wir zum Beispiel an, dass eine Anforderung mit einem JWT-Token eingegangen ist. Wir müssen das Token überprüfen, ob es ein gültiges Token ist, und dann die in dem Token gespeicherte ID herausholen, um ein Login-Benutzerobjekt zu erstellen.

Wenn Sie in diesem Fall keinen Argument Resolver verwenden, müssen Sie den Prozess der Tokenüberprüfung und der Konvertierung in ein Login-Benutzerobjekt in jedem Controller implementieren. Dies führt zu überflüssigem Code in Controllern, die Benutzerüberprüfung erfordern, und erhöht die Verantwortung des Controllers. Diese Probleme können mit Argument Resolver gelöst werden.


Argument Resolver-Implementierung

Argument Resolver kann durch Implementierung von HandlerMethodArgumentResolver verwendet werden. Diese Schnittstelle schreibt vor, dass die folgenden zwei Methoden implementiert werden.


boolean supportsParameter(MethodParameter parameter);

@Nullable


  • supportsParameter-Methode
    • Eine bestimmte Annotation wird vor dem Parameter hinzugefügt, für den der Argument Resolver ausgeführt werden soll. Die supportsParameter()-Methode überprüft, ob die gewünschte Annotation an dem Parameter der angeforderten Methode angehängt ist, und gibt true zurück, wenn die gewünschte Annotation enthalten ist.
  • resolveArgument-Methode
    • Wenn die supportsParameter-Methode true zurückgibt, d. h. wenn eine Methode mit der angehängten Annotation vorhanden ist, ist dies eine Methode, die den Parameter an die gewünschte Form bindet und Informationen zurückgibt.


Die Implementierung des Controllers unter Verwendung des Argument Resolver sieht wie folgt aus:


@GetMapping("/me")
public ResponseEntity findMemberOfMine(@AuthenticationPrincipal LoginMember loginMember) {
    MemberResponse memberResponse = memberService.findMember(loginMember.getId());
    return ResponseEntity.ok().body(memberResponse);


Unterschied zwischen Argument Resolver und Interceptor

  • Argument Resolver wird nach dem Interceptor ausgeführt. Wenn eine Anforderung in den Controller gelangt, wird das gewünschte Objekt basierend auf den mit der Anforderung eingegangenen Werten zurückgegeben.
  • Im Gegensatz dazu fängt der Interceptor die Anforderung ab, bevor der eigentliche Controller ausgeführt wird, und kann kein bestimmtes Objekt zurückgeben. Es gibt nur Rückgabetypen vom Typ boolean oder void.


Quelle


Erwartete Interviewfragen und Antworten

Was ist ein Filter?

Ein Filter ist eine Funktion, die zusätzliche Aufgaben für alle Anforderungen behandeln kann, die mit einem URL-Muster übereinstimmen, bevor oder nachdem eine Anforderung an das Dispatcher-Servlet weitergeleitet wird. Es wird vom Servlet-Container ausgeführt.


Wann wird ein Filter verwendet?

Filter können verwendet werden, um Aufgaben zu erledigen, die unabhängig von Spring sind. Sie können auch verwendet werden, um eingehende Parameter zu validieren.

Beispiele hierfür sind gemeinsame Aufgaben im Zusammenhang mit der Sicherheit, Protokollieren aller Anforderungen, Komprimieren von Bildern/Daten und Codieren von Zeichenfolgen sowie Anpassen von ServletRequest.


Was ist ein Interceptor?

Interceptor ist eine Funktion, mit der Sie Anforderungen und Antworten referenzieren oder bearbeiten können, bevor oder nachdem das Dispatcher-Servlet den Controller aufruft. Das heißt, es wird vom Spring- Container ausgeführt.


Wann wird ein Interceptor verwendet?

Interceptor können verwendet werden, um Aufgaben zu erledigen, die sich auf die Anforderung des Clients beziehen und global verarbeitet werden müssen. Sie können auch verwendet werden, um die Validierung durchzuführen, wenn Servicelogik verwendet wird.

Beispiele hierfür sind gemeinsame Aufgaben wie Authentifizierung/Autorisierung, Protokollieren von API- Aufrufen und Verarbeiten von Daten, die an den Controller übergeben werden.


Was ist der Unterschied zwischen Filter und Interceptor?

Filter werden vom Servlet-Container ausgeführt, während Interceptor vom Spring-Container ausgeführt werden.

Filter können vor und nach dem Dispatcher-Servlet verwendet werden, während Interceptor vor und nach dem Controller verwendet werden können.

Daher sollten Filter verwendet werden, wenn Aufgaben ausgeführt werden müssen, die unabhängig von Spring sind, während Interceptor verwendet werden sollten, wenn Aufgaben ausgeführt werden müssen, die sich auf die Anforderung des Clients beziehen und global verarbeitet werden müssen.


Was ist ein Argument Resolver?

Argument Resolver ist eine Funktion, die Ihnen indirekt helfen kann, das gewünschte Objekt zu erstellen, wenn eine Anforderung in den Controller gelangt, basierend auf dem Wert, der mit der Anforderung eingegangen ist.


Wann wird ein Argument Resolver verwendet?

Sie können einen Argument Resolver verwenden, wenn eine Anforderung mit einem JWT-Token eingegangen ist und Sie das Token überprüfen müssen, ob es ein gültiges Token ist. Anschließend können Sie die in dem Token gespeicherte ID herausholen, um ein LoginMember-Objekt zu erstellen.


Was ist der Unterschied zwischen Interceptor und Argument Resolver?

Argument Resolver gibt das gewünschte Objekt zurück, wenn eine Anforderung in den Controller gelangt, basierend auf den mit der Anforderung eingegangenen Werten. Im Gegensatz dazu kann Interceptor kein Objekt zurückgeben. Argument Resolver wird nach Interceptor ausgeführt.

제이온
제이온
제이온
제이온
[Spring] @Async-Verwendungsmethode Erfahren Sie, wie Sie mit Spring @Async die asynchrone Verarbeitung in Java einfach implementieren. Mit der @Async-Annotation können Sie synchrone Methoden asynchron umwandeln und die Effizienz durch Thread-Pool-Einstellungen verbessern. Außerdem wird erl

25. April 2024

[Effektives Java] Item 1. Statische Fabrikmethoden in Betracht ziehen Statische Fabrikmethoden sind eine flexible und effiziente Möglichkeit, Instanzen zu erstellen, anstatt Konstruktoren zu verwenden. Sie können benannt werden, Instanzen zurückgeben, die bestimmten Bedingungen entsprechen, und die Leistung durch Caching ve

27. April 2024

[Java] Reflection-Konzept und Verwendung Reflection ist eine API, die es ermöglicht, während der Ausführung eines Java-Programms auf Klasseninformationen zuzugreifen und Klassen zu manipulieren. Es ermöglicht die Erstellung von Klassen und den Zugriff auf Felder und Methoden zur Laufzeit, kann a

25. April 2024

[Nicht-Hauptfach, Überleben als Entwickler] 14. Zusammenfassung der häufigen technischen Vorstellungsgesprächsinhalte für Einsteiger Dieser Leitfaden ist für die Vorbereitung auf technische Vorstellungsgespräche für Einsteiger. Hauptspeicherbereich, Datenstrukturen, RDBMS und NoSQL, prozedurale und objektorientierte Programmierung, Überladen und Überschreiben, Seitenersatzzustände, Pro
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3. April 2024

[Concurrency] Atomarer Vorgang: Memory Fence und Memory Ordering Dieser Blogbeitrag erklärt, wie bei atomaren Operationen die Reihenfolge im Speicher berücksichtigt wird, und die Bedeutung von Ordering-Optionen. Es werden verschiedene Ordering-Optionen wie Relaxed, Acquire, Release, AcqRel, SecCst erläutert und die Vor
곽경직
곽경직
곽경직
곽경직
곽경직

12. April 2024

Was ist eine Regelbasis? Ein regelbasierter Chatbot ist ein Chatbot, der auf vordefinierten Regeln basiert und auf Benutzereingaben antwortet. Er eignet sich für einfache Fragen oder die Bereitstellung standardisierter Informationen. FAQ-Chatbots oder Kundensupport-Chatbots, die
꿈많은청년들
꿈많은청년들
Ein Bild mit der Aufschrift Regelbasis
꿈많은청년들
꿈많은청년들

16. Mai 2024

[Nicht-Fachmann, Überleben als Entwickler] 16. Tipps für die Erstellung eines Portfolios für Einsteiger Ein Einsteigerentwickler (insbesondere Nicht-Fachmann) muss bei der Erstellung eines Portfolios nicht nur die Technologie, sondern auch die entwickelten Dienste oder Funktionen klar erläutern. Zum Beispiel, wenn es sich um ein "Jobsuchenden-Community"-Pro
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3. April 2024

Was ist ein JWT (JSON Web Token)? Ein JSON Web Token (JWT) ist ein offener Standard zum sicheren Übertragen von Informationen. Es verwendet signierte Token, um die Integrität und Sicherheit von Informationen zu gewährleisten. Der Header enthält den Token-Typ und den Signaturalgorithmus, d
Seize the day
Seize the day
Seize the day
Seize the day
Seize the day

4. März 2024

[React Hook] useState Dieser Artikel enthält eine detaillierte Erklärung, warum der React useState-Hook bei einem Re-Rendering die gesamte Komponente erneut rendert, wie man Werte beibehält und wie die interne Implementierungsstruktur funktioniert. Durch die Analyse des ReactF
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

14. März 2024