![translation](https://cdn.durumis.com/common/trans.png)
Dies ist ein von KI übersetzter Beitrag.
Sprache auswählen
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.
- 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.
- 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
- https://mangkyu.tistory.com/173
- https://junhyunny.github.io/spring-boot/filter-interceptor-and-aop/
- https://supawer0728.github.io/2018/04/04/spring-filter-interceptor/
- https://tecoble.techcourse.co.kr/post/2021-05-24-spring-interceptor/
- https://baeldung-cn.com/spring-mvc-handlerinterceptor-vs-filter
- https://www.baeldung.com/spring-boot-add-filter
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.