Heim > Java > javaLernprogramm > Entdecken Sie das Implementierungsprinzip von Spring Interceptor

Entdecken Sie das Implementierungsprinzip von Spring Interceptor

王林
Freigeben: 2024-01-11 15:18:23
Original
691 Leute haben es durchsucht

Entdecken Sie das Implementierungsprinzip von Spring Interceptor

Enthüllung des Implementierungsmechanismus von Spring Interceptor

Einführung

Bei der Entwicklung von Webanwendungen müssen wir häufig bestimmte Vorgänge ausführen, bevor oder nachdem die Anforderung den Controller erreicht. Authentifizieren Sie beispielsweise Benutzer, zeichnen Sie Protokolle auf, behandeln Sie Ausnahmen usw. Das Spring-Framework stellt uns Interceptoren (Interceptors) zur Verfügung, mit denen Interceptors Anforderungen und Antworten vor- und nachbearbeiten können.

Dieser Artikel befasst sich mit dem Implementierungsmechanismus von Spring Interceptor. Wir werden verstehen, was Interceptoren sind, wie sie funktionieren, und anhand spezifischer Codebeispiele zeigen, wie benutzerdefinierte Interceptoren implementiert werden.

Das Konzept des Interceptors

Interceptor ist ein Mechanismus im Spring-Framework für die Vor- und Nachbearbeitung von Anfragen. Es ähnelt Filtern in Servlets, aber im Gegensatz zu Filtern basieren Interceptoren auf Methodenebene. Es kann Methoden im angegebenen Controller abfangen und benutzerdefinierte Logik ausführen, bevor und nachdem die Methode ausgeführt wird. Interceptoren können uns dabei helfen, einige allgemeine Verarbeitungen zu implementieren, die nichts mit der Geschäftslogik zu tun haben, und die Wiederverwendbarkeit und Wartbarkeit des Codes zu verbessern.

Wie der Interceptor funktioniert

Der Interceptor wird durch AOP (Aspect Oriented Programming) implementiert. Spring Interceptor basiert auf der HandlerInterceptor-Schnittstelle, die drei Methoden definiert: preHandle, postHandle und afterCompletion. Der spezifische Arbeitsablauf ist wie folgt:

  1. Wenn der Client eine Anfrage an DispatcherServlet sendet, findet DispatcherServlet das entsprechende HandlerMapping basierend auf der angeforderten URL und ruft die entsprechende HandlerExecutionChain ab.
  2. HandlerExecutionChain enthält eine Reihe von HandlerInterceptor.
  3. DispatcherServlet ruft nacheinander die preHandle-Methode jedes Interceptors auf und überprüft den Rückgabewert der Methode.

    • Wenn „true“ zurückgegeben wird, setzt die Anforderung die Verarbeitung fort und gibt die preHandle-Methode des nächsten Interceptors ein.
    • Wenn false zurückgegeben wird, wird die Anfrage hier unterbrochen und an den Client zurückgegeben.
  4. Wenn die preHandle-Methoden aller Interceptoren true zurückgeben, ruft DispatcherServlet die handleRequest-Methode des Handler-Objekts in HandlerExecutionChain auf.
  5. Das Handler-Objekt in HandlerExecutionChain führt Geschäftslogik aus und gibt ModelAndView zurück.
  6. DispatcherServlet ruft nacheinander die postHandle-Methode jedes Interceptors auf und übergibt ModelAndView an ihn.
  7. Die postHandle-Methode des Interceptors kann ModelAndView ändern und verbessern.
  8. DispatcherServlet übergibt ModelAndView an ViewResolver zum Parsen und Rendern der Ansicht.
  9. Nachdem die Ansicht gerendert wurde, ruft DispatcherServlet nacheinander die afterCompletion-Methode jedes Interceptors auf, um einige Ressourcen weiter zu bereinigen.

Implementierung eines benutzerdefinierten Interceptors

Im Folgenden wird anhand eines konkreten Beispiels gezeigt, wie ein benutzerdefinierter Interceptor implementiert wird.

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //  在方法执行之前进行逻辑处理
        System.out.println("拦截器preHandle方法执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在方法执行之后进行逻辑处理
        System.out.println("拦截器postHandle方法执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染完成后进行逻辑处理
        System.out.println("拦截器afterCompletion方法执行");
    }
}
Nach dem Login kopieren

Im obigen Code haben wir die HandlerInterceptor-Schnittstelle implementiert und drei ihrer Methoden überschrieben. In der preHandle-Methode können wir einige Vorverarbeitungen durchführen; in der postHandle-Methode können wir ModelAndView ändern und verbessern; in der afterCompletion-Methode können wir einige Ressourcenbereinigungsvorgänge durchführen.

Als nächstes müssen wir den benutzerdefinierten Interceptor im Spring-Container konfigurieren. Dies kann durch XML-Konfiguration oder Annotationen erreicht werden.

XML-Konfigurationsmethode

Fügen Sie die folgende Konfiguration in der Spring-Konfigurationsdatei hinzu:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login" />
        <bean class="com.example.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>
Nach dem Login kopieren

In der obigen Konfiguration verwenden wir das Tag <mvc:interceptor>, um den Interceptor zu definieren, und übergeben < Das Tag code><mvc:mapping> gibt den abzufangenden URL-Pfad an. Verwenden Sie das Tag <mvc:exclude-mapping>, um einige URL-Pfade auszuschließen, die nicht abgefangen werden müssen. <mvc:interceptor>标签来定义拦截器,并通过<mvc:mapping>标签指定要拦截的URL路径。使用<mvc:exclude-mapping>标签来排除一些不需要拦截的URL路径。

注解方式配置拦截器

在拦截器类上添加@Component注解,并使用@Order

Konfigurieren Sie den Interceptor mithilfe von Annotationen.

Fügen Sie die Annotation @Component zur Interceptor-Klasse hinzu und verwenden Sie die Annotation @Order, um die Ausführungsreihenfolge des Interceptors anzugeben.

@Component
@Order(1)
public class MyInterceptor implements HandlerInterceptor {
    // 省略代码
}
Nach dem Login kopieren

Fügen Sie die folgende Konfiguration in der Konfigurationsklasse von Spring hinzu:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}
Nach dem Login kopieren
In der obigen Konfiguration fügen wir den Interceptor zur Interceptor-Registrierung hinzu, indem wir die WebMvcConfigurer-Schnittstelle implementieren und die Methode addInterceptors darin neu schreiben.

Fazit🎜🎜Durch diesen Artikel haben wir das Konzept und das Funktionsprinzip von Spring-Interceptoren verstanden und anhand spezifischer Codebeispiele gezeigt, wie benutzerdefinierte Interceptoren implementiert werden. Interceptoren sind eine sehr wichtige Funktion im Spring-Framework, die uns dabei helfen kann, eine gemeinsame Verarbeitungslogik zu implementieren und die Wiederverwendbarkeit und Wartbarkeit des Codes zu verbessern. Ich hoffe, dieser Artikel hat Ihnen beim Verständnis von Spring Interceptors geholfen. 🎜

Das obige ist der detaillierte Inhalt vonEntdecken Sie das Implementierungsprinzip von Spring Interceptor. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage