1. Übersicht
Interceptors werden immer mehr verwendet, insbesondere nach der Popularität der Slice -Programmierung. Was kann ein Interceptor normalerweise tun?
In unserer Einführung in den Agenten erwähnten wir, dass der Ruf der statistischen Funktionen Zeit in Anspruch nimmt. Diese Idee ist genau die gleiche wie die Umgebungserhöhung von AOP.
Im Allgemeinen lautet das Szenario wie folgt:
Und andere und so weiter.
2. Spring's Interceptor
Egal, ob es sich um SpringMVC oder Springboot handelt, wir müssen den Interceptor erwähnen:
org.springframework.web.servlet.handler.HandlerInterceptoradapter
public abstract Class HandlerInterceptorAdapter implementiert AsynchandlerInterceptor (// @Override public boolean prehandle (httpServletRequest -Anfrage, httpServletResponse -Antwort, Objekthandler) aus, die Ausnahme {return true; } // Ausführen nach der Ausführung der Zielmethode, aber vor der Rückgabe der Anforderung können wir die modelAndView @Override public void poTHandle (httpServletRequest -Anforderung, httpServletResponde -Antwort, Objekthandler, ModelandView ModelandView) {{} // Execute @OversCompletion -Anfrage @Overscompletion @OversCompletion @OversCompletion @OversCompletion -Anfrage (httpletRepe | HttpServletResponse -Antwort, Objekthandler, Ausnahme ex) löst Ausnahme aus {} // verwendet, um asynchrone Anforderungen zu verarbeiten. Diese Methode wird ausgelöst, wenn im Controller @Override public void AfterconcurrentHandlingStarted (httpServletRequest -Anforderung, httpServletResponse -Antwort, Objekthandler) Ausnahme {}} ausgelöst wird (httpServletRequest -Anforderung)Implementieren Sie einen Interceptor zur Überprüfung einfacher Berechtigungen
1. Passen Sie eine Berechtigungsanentwicklung @Auth an
@Erittened@target ({Elementtype.type, elementtype.method})@retention(retentionPolicy.Runtime)@documentedPublic @Interface Auth {String user () Standard ";}2. Fügen Sie der Controller -Methode Anmerkungen hinzu
Nach dem Hinzufügen der Anmerkungen im vorherigen Schritt sollten Sie der von Ihnen verwendeten Methode wie folgt relevante Anmerkungen hinzufügen.
@RastController @EnableAutoConfigurationPublic Class DemoConTroller {@Auth (user = "admin") @RequestMapPing (value = "/hello", method = requestMethod.get) public String sayshello () {return "Hello World." }}3. Implementieren Sie die Interceptor -Funktion
Anforderungen: Wenn der Benutzer über das /Hallo auf das URI zugreift, wird er verifiziert. Wenn es admin ist, wird es freigegeben, sonst wird es abgelehnt. Angenommen, die Identität des Benutzers befindet sich im URL -Parameter.
Idee: Daher müssen wir den Benutzer überprüfen, bevor wir SayShello () ausführen. Wenn seine Identität die gleiche Identität in der Annotation entspricht, wird sie freigegeben. Daher müssen wir in Prehandle () Aufhebens machen.
Schwierigkeitsgrad: Wie erhalten wir die @Auth -Annotation für die Controller -Methode? Wenn man sich die drei Parameter von Prehandle () ansieht, scheint niemand Anmerkungen in der Controller -Klasse bereitzustellen.
Tatsächlich lautet der dritte Parameter -Handler im Allgemeinen seinen Typ: org.springframework.web.method.Handlermethod und enthält relevante Informationen über die Annotation.
Warum sagst du das?
Im Springboot ist der Standardtyp der Annotation die Funktionsstufe, während in SpringMVC der Standardtyp die Controller -Objektebene ist.
Wenn Sie es daher in SPRINGMVC konfigurieren müssen:
<Bean/>, so dass sein Typ Handlers ist.
Schauen wir uns die spezifische Implementierungslogik an:
@Override public boolean prehandle (httpServletRequest -Anforderung, httpServletResponse -Antwort, Objekthandler) löst Ausnahme aus {System.out.println ("prehandle"); if (! Handler.getClass (). isassignableFrom (handlermethod.class)) {System.out.println ("Cat Cast Handler to handlermethod.class"); zurückkehren; } // Annotation AUT CHAUT = ((HandleMethod) Handler) .GetMethod (). GetAnnotation (auth.class); if (auth == null) {System.out.println ("kann @Auth in diesem URI nicht finden:" + Request.getRequesturi ()); zurückkehren; } // Die Identität des Benutzers aus den Parametern herausnehmen und String admin = auth.User () verifizieren; if (! admin.equals (request.getParameter ("user"))) {System.out.println ("Erlaubnis verweigert"); Antwort.SetStatus (403); false zurückgeben; } Return true; }Tatsächlich gibt es zwei Punkte in der Implementierungslogik: Nehmen Sie die Identität aus den Parametern heraus und vergleichen Sie sie mit der Annotation.
4. Konfigurieren Sie den Interceptor
Wie kann der Interceptor gerade jetzt effektiv sein?
Zu diesem Zeitpunkt müssen wir konfigurieren: webmvcconFigurerAdapter
Die spezifische Implementierung ist wie folgt:
@ConfigurationPublic Class CONFORDADAPTER erweitert webmvcconFigurerAdapter {@Override public void addInterceptors (InterceptorRegistry -Registrierung) {Registry.AdDInterceptor (neuer loginInterceptor ()). AddPathPatterns ("/Hallo"); }}Hinweis: Hier sind zwei Punkte zu beachten. Eine davon ist die Annotation von @Configuration, so dass der Springboot -Service diese Konfiguration ermitteln kann. Das andere ist die Konfigurationsübereinstimmung, die das "/Hallo" abfangen soll. ("/**" soll alle Zugriffe blockieren)
4. Betrieb
Besuchen Sie http://127.0.0.1:8080/hello?user=admin, um die Ergebnisse zu sehen.
Weitere Informationen zum Code in diesem Artikel finden Sie unter: https://github.com/hawkingfoo/springboot-interceptor
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.