Ich habe bereits Filter gelernt, aber die Filter sind für Servlets und werden in SpringMVC- und Federstiefeln verwendet. Sie fühlen sich in Bezug auf Funktionen nicht sehr nützlich.
Lassen Sie uns hier über Interceptors erfahren.
1. Die Reihenfolge der Ausführung des Interceptors
1. Inhalt
2. Interceptor
Im Interceptor fügte ich drei (zuerst, zwei, dritte) hinzu, aber der Inhalt ist fast gleich.
Paket org.elvin.boot.Interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework FirstInterceptor implementiert handlerInterceptor {@Override public boolean prehandle (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse, Objekt O) löst eine Ausnahme aus {System.out.println ("firstInterceptor prehandle"); zurückkehren; } @Override public void poThandle (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse, Object O, modelAndView modelAndView) löst eine Ausnahme aus {System.out.println ("erster Interceptor postandhandle"); } @Override public void AfterCompletion (httpServletRequest httpServletRequest, httpServletResponse httpServletResponse, Objekt O, Ausnahme E) Ausnahme {System.out.println ("erster Intenceptor -Nachkommen"); }}Prehandle gibt vor, bevor die folgende Ausführung fortgesetzt wird.
Interceptor -Registrierung:
Paket org.elvin.boot.Interceptor; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.Interceptorregistry; org.springFramework.web.servlet.config.annotation.webmvcconFigurerAdapter; @ConfigurationPublic Class RegisterInterceptor erweitert webmvcconFigerAdapter {@Override Public void AddInterceptors (InterceptorRegistry) {Registry.AdDinterceTor.AdDinterceTor (NewStinterceTor (); Registry.AdDInterceptor (new TwoInterceptor ()); Registry.AdDInterceptor (neuer dritterInterzeptor ()); Super.AdDInterceptors (Registrierung); }}Um die Ausführungsreihenfolge zu überprüfen, wird hier Thymeleaf verwendet, und dann wurden die Eigenschaften, die ich im Hintergrund übergeben habe, im Vordergrund zugegriffen. Beim Zugriff werden die Informationen zur Konsole gedruckt
Paket org.elvin.boot.pojo; Public Class Book {private Zeichenfolge Name; public String getName () {System.out.println ("Ansicht: book'name ist" + name); Rückgabename; } public void setName (String -Name) {this.name = name; }}Regler:
Paket org.elvin.boot.controller; import org.elvin.boot.pojo.book; import org.springframework.stereotype.controller; org.springFramework.web.bind.annotation.RequestMapping;@Controller@RequestMapping ("First") Public Class FirstController {private String controllerPath = "First/"; @GetMapping ("Index") public String Index (Modellmodell) {System.out.println ("Controller: FirstController -Index DO ..."); Buchbuch = neues Buch (); book.setName ("Spring Boot"); model.addattribute ("Buch", Buch); return ControllerPath + "Index"; }}Sicht:
<! DocType html> <html Lang = "en"> <head> <meta charset = "utf-8"/> <title> Titel </title> </head> <body> <h1 th: text = "$ {book.name}"> </h1> </body> </html>Bei Zugriff auf Localhost: 8080/First/Index werden die Antwortinformationen auf der Konsole ausgegeben.
Auf diese Weise ist die Ausführungsreihenfolge eines einzelnen Interceptors zu sehen.
1. Die vor der Controller -Methode ausgeführte Prehandle -Methode wird ausgeführt
2. Führen Sie die Controller -Aktionsmethode aus
3. Führen Sie nach der Ausführung der Aktion vor dem Parsen der Ansicht (falls vorhanden) die Post -Handle -Methode des Interceptors aus
4. Analysieren Sie die Ansicht
5. Führen Sie nach der Parsen die Aftercompletion -Methode aus
Wenn mehrere Interceptors registriert sind, ist die Ausführungsreihenfolge wie in der Abbildung dargestellt.
2. Interceptor implementiert die Berechtigungsüberprüfung
In ähnlicher Weise fügen Sie zuerst die Berechtigungsabfangwäsche hinzu
Paket org.elvin.boot.Interceptor; import org.elvin.boot.annotation.nologin; import org.springframework org.springFramework.web.servlet.ModelandView; import Javax.servlet.http.httpServletRequest; import Javax.servlet.http.httpserdRetRespectRep; PREHhandle (httpServletRequest -Anforderung, httpServletResponse -Antwort, Objekthandle) löst eine Ausnahme aus {HandleMethod -Methode = (HandleMethod) -Handle; Class <?> ControllerType = methode.getBeanType (); if (method.getMethodannotation (nologin.class)! = null || controllerType.getannotation (nologin.class)! } HttpSession Session = Request.GetSession (); String token = (String) session.getAttribute ("token"); if (! Stringutils.isempty (Token)) {return true; } response.sendredirect ("/login/index"); false zurückgeben; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Objekt O, Ausnahme E) Ausläufe Ausnahme {}}Dann registrieren
Paket org.elvin.boot.Interceptor; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.Interceptorregistry; org.springFramework.web.servlet.config.annotation.webmvcconFigurerAdapter; @ConfigurationPublic Class RegisterInterceptor erweitert webmvcconFigurerAdapter {@Override Public void AddInterceptors (Interceptorregistry) {Registry.AdDinterceTor (New LininterceNceptor) (New LoginInterceTor ()) () {Registry.AdDinterceTor.AdDinterceTor (New LoginInterceTor ()) (). Super.AdDInterceptors (Registrierung); }}Fügen Sie dem Controller einen Anmeldesteuerer hinzu, geben Sie eine Anmeldeseite und die Abmeldemethode an
Paket org.elvin.boot.controller; import org.elvin.boot.annotation.nologin; import org.springframework.bean.factory.annotation org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.requestmapping; javax.servlet.http.httpServletResponse; importieren javax.servlet.http.httpSession;@nologin@controller@RequestMapping ("Login") öffentliche Klasse Logintroller {@autowred private httpServletrequest Request; @Autowired Private httpServletResponse -Antwort; private String ControllerPath = "Login/"; // @nologin @getMapping ("index") public String index () {httpSession session = request.getSession (); Session.SetAttribute ("Token", "Token"); return ControllerPath + "Index"; } // @nologin @postmapping ("checkout") @ResponseBody public String checkout () {httpSession Session = Request.GetSession (); Session.SetAttribute ("Token", NULL); zurück "ok"; }}Hier habe ich eine loginfreie Annotation vorgenommen, die dem Controller oder der Aktion hinzugefügt werden kann.
Paket org.elvin.boot.Annotation; import Java.lang.annotation.elementtype; importieren java.lang.Annotation.retention; import Java.lang.annotation Elementtype.method}) @retention (retentionpolicy.runtime) public @Interface nologin {}In der Annotation ist kein Inhalt erforderlich.
Anmeldeseite (die Anmeldeseite hier ist nur zum Abmelden. Nach dem Besuch dieser Seite bedeutet dies, dass der Anmeldung erfolgreich ist).
<! DocType html> <html xmlns: th = "http://www.thymeleaf.org"> <head> <meta charset = "utf-8"/> <title> title </title> </head> <body> <div> <Eingabe type = "button =" logout "id =" id = "id =" th:src="@{/js/jquery-1.11.1.js}"></script><script th:inline="javascript"> $(function () { $(".container").delegate("#checkOut", "click", function () { $.ajax({ url: [[@{/login/checkOut}]], type: 'post', data: {}, Erfolg: function (res) {if (res == "OK") {alert ("logout erfolgreich"); }); </script> </body> </html>Ergebnisse Demonstrationsmethode:
Öffnen Sie im Browser zuerst die Seite http: // localhost: 8080/login/index und greifen Sie dann auf die Seite http: // localhost: 8080/First/Index auf der neuen Registerkarte zu.
Sie werden feststellen, dass Sie beim Zugriff auf First/Index darauf zugreifen können.
Klicken Sie zu diesem Zeitpunkt auf der Seite Login/Index auf die Schaltfläche Abmelden, aktualisieren Sie die erste/Index -Seite und Sie werden direkt zur Anmeldeseite springen.
Die obige Beispielerläuterung des String -Starts und des benutzerdefinierten Interceptors ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.