Im vorherigen Beispiel haben wir Zuul verwendet, um ein Gateway zu bauen //www.vevb.com/article/133235.htm
Ich werde hier nicht auf Details über die Rolle von Gateways eingehen. Unser heutiger Fokus liegt auf Zuuls Filter. Über den Filter können wir die Sicherheitsregelung implementieren. Beispielsweise können nur Clients mit Benutzername und Kennwort in den Anforderungsparametern auf die Ressourcen des Servers zugreifen. Wie kann man Filter implementieren?
Um den Filter zu implementieren, sind folgende Schritte erforderlich:
1. Erben Sie die Zuulfilter -Klasse. Um die Eigenschaften des Filters zu überprüfen, erstellen wir hier 3 Filter.
Filter durch Benutzername
Paket com.chhliu.springcloud.zuul; importieren javax.servlet.http.httpServletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestcontext; öffentliche Klasse AccessUnernameFilter erweitert Zuulfilter {@Override public Object run () {RequestContext ctx = RequestContext.getCurrentContext (); HttpServletRequest request = ctx.getRequest (); System.out.println (String.Format (" %s AccessUnernameFilter -Anforderung an %s", Request.getMethod (), Request.GetRequesturl (). ToString ()); String username = request.getParameter ("userername"); // den angeforderten Parameter if (null! = Userername && username.equals.equals ("chhliu") {// Wenn der angeforderte Parameter nicht leer ist und der Wert CTX.SetsendzuSpode (True); // Ctx.setsetsendzuResponde (True); // Ctx.setSestatuSponde (true); // Ctx.setSestatuStaSeStaS (200); ctx.set ("issuccess", true); // Legen Sie den Wert fest, um den nächsten Filter den Status des vorherigen Filterrückgabe -Nulls anzuzeigen. } else {ctx.setsendzuResponse (false); // filtern Sie die Anforderung und leiten Sie es nicht ctx.setResponSestatusCode (401); // Die Fehlercode ctx.setRespondeBody zurückgeben ("{/" result/":/" userername ist nicht richtig!/"}"). null zurückkehren; }} @Override public boolean sollteFilter () {return true; // Ob das Filter ausgeführt werden soll, ist hier wahr, dass Filterung erforderlich ist. Durch Erben von Zuulfilter und Überschreiben der oben genannten 4 Methoden können Sie einen einfachen Filter implementieren. Das Folgende ist eine Beschreibung der relevanten Aufmerksamkeitspunkte.
FilterType: Gibt eine Zeichenfolge zurück, die den Typ des Filters darstellt. In Zuul sind vier Filtertypen mit unterschiedlichen Lebenszyklen definiert, wie folgt:
Zuduuls Hauptanfrage -Lebenszyklus umfasst Phasen wie "Pre", "Route" und "Post". Für jede Anfrage werden alle Filter mit diesen Typen ausgeführt.
Filterorder: Definiert die Ausführungsreihenfolge von Filtern über den int -Wert
SHATFILTER: Gibt einen Booleschen Typ zurück, um festzustellen, ob der Filter ausgeführt werden soll, damit diese Funktion den Schalter des Filters implementieren kann. Im obigen Beispiel geben wir direkt true zurück, sodass der Filter immer wirksam wird
Lauf: Die spezifische Logik des Filters. Es ist zu beachten, dass wir hier ctx.setsendzuResponse (False) verwenden, um die Anforderung zu filtern und sie nicht zu leiten, und dann den Fehlercode, den er über CTX.SetResponsseStatusCode (401) zurückgibt, festgelegt wird.
Koordination zwischen Filtern
Es gibt keine direkte Möglichkeit für Filter, aufeinander zugreifen zu können. Sie können RequestContext verwenden, um Status zu teilen, eine kartenähnliche Struktur mit einigen expliziten Accessor-Methoden für Primitive, die als Zuul betrachtet werden. Sie werden intern mit ThreadLocal implementiert. Interessierte Schüler können den Quellcode überprüfen.
Erstellen Sie einen weiteren Filter und Filter gemäß dem Passwort:
Paket com.chhliu.springcloud.zuul; importieren javax.servlet.http.httpServletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestcontext; öffentliche Klasse AccessPasswordFilter erweitert Zuulfilter {@Override public Object run () {RequestContext ctx = RequestContext.getCurrentContext (); HttpServletRequest request = ctx.getRequest (); System.out.println (string.format (" %s accessPasswordfilter -Anforderung an %s", Request.getMethod (), Request.GetRequesturl (). ToString ())); String username = request.getParameter ("Passwort"); if (null! = userername && userername.equals ("123456") {ctx.setsendzuResponse (true); ctx.setResponsestatuscode (200); ctx.set ("issuccess", true); null zurückkehren; } else {ctx.setsendzuResponse (false); ctx.setResponsestatuscode (401); ctx.setResponseBody ("{/" result/":/" Passwort ist nicht korrekt!/"}"); ctx.set ("issuccess", false); null zurückkehren; }} @Override public boolean sollteFilter () {requestContext ctx = requestContext.getCurrentContext (); return (boolean) ctx.get ("issuccess"); // Wenn das Ergebnis des vorherigen Filters wahr ist, bedeutet dies, dass der vorherige Filter erfolgreich war und den aktuellen Filter eingeben muss. Wenn das Ergebnis des vorherigen Filters falsch ist, bedeutet dies, dass der vorherige Filter nicht erfolgreich war. Es ist nicht erforderlich, die folgende Filteraktion auszuführen. Überspringen Sie alle nachfolgenden Filter und geben Sie das Ergebnis zurück} @Override public int filterorder () {return 1; // Priorität auf 1} @Override public String filterType () {return "pre"; }} Erstellen Sie am Ende einen Postfilter
Paket com.chhliu.springcloud.zuul; importieren javax.servlet.http.httpServletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestcontext; öffentliche Klasse AccessTokenFilter erweitert Zuulfilter {@Override public Object run () {RequestContext ctx = requestContext.getCurrentContext (); HttpServletRequest request = ctx.getRequest (); System.out.println (String.Format (" %s AccessTokenFilter -Anforderung an %s", request.getMethod (), request.getRequesturl (). ToString ()); ctx.setsendzuResponse (true); ctx.setResponsestatuscode (200); ctx.setResponsebody ("{/" name/":/" chhliu/"}"); // Ausgabe des Endergebnisrücklaufs Null; } @Override public boolean sollte filter () {return true; } @Override public int filterOrder () {return 0; } @Override public String filterType () {return "post"; // Nach der Verarbeitung der Anforderung wird der Filter eingegeben}} 2. In der Hauptklasse drehen Sie zunächst die ersten beiden Filter ein
@Bean Public AccessUnernameFilter AccessusernameFilter () {return New AccessUnernameFilter (); } @Bean öffentlich AccessPasswordFilter AccessPasswordFilter () {Neue AccessPasswordFilter () zurückgeben; } 3. Geben Sie die Anfrage ein und überprüfen Sie
(1) Die Anfrage lautet: http: // localhost: 8768/h2service/user/1? Userername = chhliu
Das Testergebnis lautet: {"Ergebnis": "Passwort ist nicht korrekt!"}
Konsolendruckergebnisse
AccessUnernameFilter -Anforderung an http: // localhost: 8768/h2service/user/1 erhalten
Get AccessPasswordFilter -Anforderung an http: // localhost: 8768/h2Service/user/1
Bestanden AccessUnernameFilter -Filter, fehlgeschlagen bei der Überprüfung der AccessPasswordFilter -Filter
Es gibt keinen SQL -Druck im Hintergrund, was bedeutet, dass die Anfrage nicht weitergeleitet wird
(2) Die Anforderung lautet: http: // localhost: 8768/h2service/user/1? Password = 123456
Das Testergebnis ist: {"Ergebnis": "Benutzername ist nicht korrekt!"}
Konsolendruckergebnisse:
AccessUnernameFilter -Anforderung an http: // localhost: 8768/h2service/user/1 erhalten
Dies bedeutet, dass der AccessusernameFilter -Filter erreicht wurde, der AccessPasswordfilter -Filter jedoch nicht erreicht wurde. Da der AccessNameFilter -Filter eine höhere Priorität hat, wird er zuerst ausgeführt. Bei der Ausführung wird festgestellt, dass sich die Filterbedingungen nicht erfüllen, sodass alle Filter danach übersprungen werden und das Ergebnis ohne SQL -Druck im Hintergrund zurückgegeben wird, was darauf hinweist, dass die Anfrage nicht weitergeleitet wurde.
(3) Die Anfrage lautet: http: // localhost: 8768/h2service/user/1? Password = 123456 & userername = chhliu
Die Testergebnisse sind:
{
"id": 1,,
"Benutzername": "User1",
"Name": "Zhang San",
"Alter": 20,,
"Balance": 100,00
}
Die Ergebnisse des Konsolendrucks:
AccessUnernameFilter -Anforderung an http: // localhost: 8768/h2service/user/1 erhalten
Get AccessPasswordFilter -Anforderung an http: // localhost: 8768/h2Service/user/1
Dies bedeutet, dass der AccessusernameFilter zuerst ausgeführt wird und dann der AccessPasswordfilter ausgeführt wird. Dies steht im Einklang mit dem kleineren Bestellwert, den wir zuvor erwähnt haben, desto höher ist die Priorität.
Der gleichzeitig angeforderte Dienst hat eine SQL -Ausgabe:
Hibernate: Wählen Sie user0_.id as id1_0_0_, user0_.age als Alter2_0_0_, user0_.balance as Balance3_0_0_, user0_.name als name4_0_0_, user0_.username as username5_0_0_ user0_where0_.id =?
Zeigt an, dass die Anfrage weitergeleitet wurde.
4. Schalten Sie den Postfilter ein und führen Sie es erneut aus
Testergebnis: Der Postfilter wurde als zuletzt ausgeführt, obwohl seine Priorität 0 beträgt
In Bezug auf den Lebenszyklus von Zuuls Filter siehe die Abbildung unten
Hinweis: Das Bild oben ist ein kleiner Fehler. Routing sollte Route sein
5. Erweitern
Zuul bietet auch einen speziellen Filtertyp, nämlich: StaticResponseFilter und ChirurgicalDebugfilter
StaticResponseFilter: StaticResponseFilter ermöglicht die Erzeugung von Antworten von Zuul selbst, anstatt die Anfrage an die Quelle weiterzuleiten.
SurgicalDebugFilter: SurgicalDebugFilter ermöglicht das Routing spezifischer Anforderungen an einen abgegrenzten Debug -Cluster oder -Host.
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.