Als Gateway -Service ist Zuul eine externe Transitstation für andere Dienste, und die Anfragen werden über Zuul weitergeleitet. Dies beinhaltet, dass einige Daten nicht intakt zurückgegeben werden können, z. B. Anmeldeinformationen für die Kommunikation zwischen Diensten, Benutzerverschlüsselungsinformationen usw.
Der Benutzerdienst bietet beispielsweise eine Anmeldeschnittstelle. Nachdem der Benutzername und das Kennwort korrekt sind, wird ein Token zurückgegeben. Dieses Token wird als Pass für den Benutzerdienst verwendet. Dann kehrte das Token zurück, nachdem sich der Benutzer erfolgreich angemeldet hat. Es muss verschlüsselt oder daran gehindert werden, manipulierte zu manipulieren. Bevor Sie an anderen Schnittstellen des Benutzerdienstes ankommen, muss das Token überprüft werden. Illegale Token müssen nicht an den Benutzerdienst weitergeleitet werden, und die Informationen können direkt in der Gateway -Ebene zurückgegeben werden.
Um die vom Dienst zurückgegebenen Informationen zu ändern, müssen Sie Zuuls Filter verwenden. Bei der Verwendung müssen Sie nur Zuulfilter erben und die erforderlichen Methoden implementieren.
Zuul liefert die Standard -vier Filtertypen, die durch die Filtertype -Methode identifiziert werden.
Die Reihenfolge, in der Filter ausgeführt werden, wird nach der Filterordermethode sortiert und je kleiner der Wert ist, desto bevorzugt er. FilterConstants definiert den Ausführungsreihenfolge und Routing -Typ einiger Spalten von Standardfiltern, und die meisten Konstanten, die verwendet werden müssen, sind hier.
Wie im Beispiel gezeigt, muss nur die Anmeldeschnittstelle abgefangen werden, sodass nur die Anmeldeanforderung (/Benutzer/Login) erforderlich ist. Sie können die SHATTFILTER -Methode des Filters verwenden, um festzustellen, ob ein Abfangen erforderlich ist.
Da die Datenänderung nach dem Erfolg des Benutzerdienstes vorgenommen wird, ist der Interceptor -Typ nach dem Typ. Die Implementierung der gesamten Klasse ist wie folgt:
public class authresponseFilter erweitert AbstractZuulFilter {private statische String -String -Antwort_Key_Token = "Token"; @Value ("$ {System.config.AuthFilter.Authurl}") private String authurl; @Value ("$ {System.config.AuthFilter.TokenKey}") private String tokenkey = response_key_token; @Autowired Private Authapi Authapi; @Override public boolean sollteFilter () {RequestContext context = getCurrentContext (); return stringutils.equals (context.getRequest (). getRequesturi (). toString (), authurl); } @Override public Object run () {try {requestContext context = getCurrentContext (); InputStream stream = context.getResponSedatastream (); String body = streamutils.copyToString (Stream, charset.forname ("utf-8")); if (Stringutils.isnotblank (Körper)) {gson gson = new gson (); @SuppressWarnings ("Deaktiviert") map <String, String> result = gson.fromjson (Body, map.class); if (stringutils.isnotblank (result.get (tokenkey))) {authModel authresult = authapi.encodEToken (result.get (tokenkey)); if (authResult.getStatus ()! } String AccessToken = Authresult.getToken (); result.put (tokenkey, accessToken); } body = gson.tojson (Ergebnis); } context.setResponseBody (Körper); } catch (ioException e) {RethrowRuntimeException (e); } return null; } @Override public String filterType () {return filterConstants.post_type; } @Override public int filterorder () {return filterConstants.send_response_filter_order - 2; }} Fügen Sie in der Konfigurationsdatei die Autorisierungs -URL hinzu und geben Sie das Schlüsseltoken zurück:
System.config.AuthFilter.Authurl =/user/Login
System.Config.AuthFilter.TokenKey = Token
context.setResponsebody (Körper); Dieser Code ist ein Kern und die zurückgegebenen Daten werden durch diese Methode geändert.
Wenn sich der Benutzer erfolgreich anmeldet, wird die Token -Verschlüsselung durch autorisierte Dienste basierend auf dem zurückgegebenen Token durchgeführt. Die Verschlüsselungsmethode hier verwendet JWT. Um zu verhindern, dass Benutzer Informationen manipulieren, können illegale Anfragen direkt in der Gateway -Ebene abgefangen werden.
In Bezug auf den Ausführungsprozess des Zuul -Filters müssen es hier nicht erklärt werden. Sie können auf einen Blick den Quellcode erkennen. Zuulservletfilter:
@Override public void dofilter (servletRequest servletRequest, servletResponse servletResponse, Filterchain Filterchain) löst IOException, ServletException {try {init ((httpServletrequest)) ServletRequest, (httpServletResponse) servletRetRePletResponse) aus; versuche {prerouting (); } catch (ZuUlexception e) {error (e); poTrouting (); zurückkehren; } // Nur an die Kette weiterleiten, wenn eine Zuul -Antwort nicht gesendet wird, wenn (! RequestContext.getCurrentContext (). Sendtzuulresponse ()) {filterchain.dofilter (ServletRequest, ServletResponse); zurückkehren; } try {routing (); } catch (ZuUlexception e) {error (e); poTrouting (); zurückkehren; } try {poTrouting (); } catch (ZuUlexception e) {error (neu zulexception (e, 500, "uncured_exception_from_filter_" + e.getClass (). getName ()); } endlich {RequestContext.getCurrentContext (). UnSet (); }}Methode Beschreibung:
Die angeforderte Weiterleitung kann über den Kontext beendet werden.
Wie man den Filter beendet:
Nur Pre-Type-Filter unterstützen die Terminierungsweiterung, und andere Filter werden nacheinander ausgeführt. Darüber hinaus können Vorbereitungsfilter nur die Weiterleitung beenden, nachdem alle Filter vor dem Typ ausgeführt wurden. Der Filter kann nicht gekündigt und die Ausführung fortgesetzt werden. Schauen Sie sich den Sourter -Code von Zuulservletfilter an:
// Nur an die Kette weiterleiten, wenn eine Zuul -Antwort nicht gesendet wird, wenn (! RequestContext.getCurrentContext (). Sendtzuulresponse ()) {filterchain.dofilter (ServletRequest, ServletResponse); zurückkehren; } Der Code in diesem Artikel wurde an: https://gitee.com/cmlbeliev/springcloud eingereicht, Willkommen bei Star
Implementierung der Klasse in: com.cml.springcloud.api.filter.authresponseFilter unter dem Api-Getway-Projekt
Lokale Adresse: http://xz.vevb.com:81/201806/yuanma/cmmlBeliev-Springcloud_jb51.rar
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.