Dans l'exemple précédent, nous avons utilisé Zuul pour construire une passerelle //www.vevb.com/article/133235.htm
Je n'entrerai pas dans les détails du rôle des passerelles ici. Notre objectif aujourd'hui est le filtre de Zuul. Grâce à Filter, nous pouvons implémenter le contrôle de sécurité, par exemple, seuls les clients avec nom d'utilisateur et mot de passe dans les paramètres de demande peuvent accéder aux ressources du serveur. Alors, comment implémenter le filtre?
Pour implémenter le filtre, les étapes suivantes sont requises:
1. Hériter de la classe Zuulfilter. Afin de vérifier les caractéristiques du filtre, nous créons 3 filtres ici.
Filtre par nom d'utilisateur
package com.chhliu.springcloud.zuul; Importer javax.servlet.http.httpservletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; classe publique AccessUserNameFilter étend ZuulFilter {@Override public objet public run () {requestContext ctx = requestContext.getCurrentContext (); HttpServLetRequest request = ctx.getRequest (); System.out.println (String.Format ("% S AccessUserNameFilter Demande à% S", request.getMethod (), request.getRequestUrl (). ToString ())); String username = request.getParameter ("username"); // Obtenez le paramètre demandé if (null! = Username && username.equals ("chhliu")) {// Si le paramètre demandé n'est pas vide et la valeur est chhliu, alors CTX.SesendzuUlResponse (true); // cTx.SeteRaSSprise (200); ctx.set ("issucess", true); // Définissez la valeur pour permettre au filtre suivant de voir l'état du filtre précédent rendement nul; } else {ctx.sesendzuulResponse (false); // filtrez la demande et ne le route pas ctx.setResponSestAruscode (401); // Renvoie le code d'erreur CTX.SetResponseBody ("{/" result / ": /" username n'est pas correct! / "}"); // return le contenu d'erreur CTX.Set ("IsscUsse", false); retourner null; }} @Override public boolean aitfilter () {return true; // s'il faut exécuter le filtre, il est vrai ici, indiquant que le filtrage est requis} @Override public int filterOrder () {return 0; // La priorité est 0, plus le nombre est élevé, plus la priorité} @Override public filterType () {return "pre"; // pré-Override Public FilterType () {return "pre" En héritant de Zuulfilter et en écrasant les 4 méthodes ci-dessus, vous pouvez implémenter un filtre simple. Ce qui suit est une description des points d'attention pertinents.
FilterType: renvoie une chaîne représentant le type de filtre. Quatre types de filtres avec différents cycles de vie sont définis à Zuul, comme suit:
Le cycle de vie de la demande principale de Zuul comprend des étapes telles que "PRE", "Route" et "Post". Pour chaque demande, tous les filtres avec ces types sont exécutés.
filtre: définit l'ordre d'exécution des filtres via la valeur int
Devrait-il: renvoie un type booléen pour déterminer si le filtre doit être exécuté, de sorte que cette fonction peut implémenter le commutateur du filtre. Dans l'exemple ci-dessus, nous retournons directement vrai, donc le filtre prend toujours effet
Exécuter: la logique spécifique du filtre. Il convient de noter que nous utilisons ici CTX.SetSendzuulResponse (FALSE) pour filtrer la demande, et ne pas l'acheminer, puis définir le code d'erreur qu'il renvoie via CTX.SetResponseStAruscode (401).
Coordination entre les filtres
Il n'y a aucun moyen direct pour les filtres de s'accéder les uns aux autres. Ils peuvent utiliser RequestContext pour partager State, qui est une structure de type carte avec certaines méthodes d'accessoires explicites pour les primitives considérées comme Zuul. Ils sont implémentés en interne à l'aide de threadLocal. Les étudiants intéressés peuvent vérifier le code source.
Créez un autre filtre et filtrez en fonction du mot de passe:
package com.chhliu.springcloud.zuul; Importer javax.servlet.http.httpservletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; classe publique AccessPasswordFilter étend ZuulFilter {@Override public objet public run () {requestContext ctx = requestContext.getCurrentContext (); HttpServLetRequest request = ctx.getRequest (); System.out.println (String.Format ("% s AccessPasswordFilter Demande à% s", request.getMethod (), request.getRequestrl (). ToString ())); String username = request.getParameter ("mot de passe"); if (null! = username && username.equals ("123456")) {ctx.sesendzuulResponse (true); ctx.setResponSestAruscode (200); ctx.set ("émetteur", true); retourner null; } else {ctx.sesendzuulResponse (false); ctx.setResponSestAruscode (401); ctx.setResponseBody ("{/" result / ": /" Le mot de passe n'est pas correct! / "}"); ctx.set ("émetteur", false); retourner null; }} @Override public boolean aitfilter () {requestContext ctx = requestContext.getCurrentContext (); return (boolean) ctx.get ("issuce"); // Si le résultat du filtre précédent est vrai, cela signifie que le filtre précédent a réussi et doit entrer le filtre actuel. Si le résultat du filtre précédent est faux, cela signifie que le filtre précédent n'a pas réussi. Il n'est pas nécessaire d'effectuer l'action de filtrage suivante. Ignorez tous les filtres suivants et renvoyez le résultat} @Override public int filterOrder () {return 1; // priorité définie sur 1} @Override public String filterType () {return "pre"; }} Créer un filtre postal à la fin
package com.chhliu.springcloud.zuul; Importer javax.servlet.http.httpservletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; classe publique AccessTokenFilter étend ZuulFilter {@Override public objet public run () {requestContext ctx = requestContext.getCurrentContext (); HttpServLetRequest request = ctx.getRequest (); System.out.println (String.Format ("% S AccessTokenFilter Demande à% s", request.getMethod (), request.getRequestUrl (). ToString ())); ctx.sesendzuulResponse (true); ctx.setResponSestAruscode (200); ctx.setResponseBody ("{/" name / ": /" chhliu / "}"); // Sortie le résultat final return null; } @Override public boolean aitfilter () {return true; } @Override public int filterOrder () {return 0; } @Override public String filterType () {return "post"; // Une fois la demande traitée, le filtre sera entré}} 2. Dans la classe principale, allumez d'abord les deux premiers filtres
@Bean public AccessUserNameFilter AccessUnSerNameFilter () {return new AccessUserNameFilter (); } @Bean public AccessPasswordFilter AccessPasswordFilter () {return new AccessPasswordFilter (); } 3. Entrez la demande et vérifiez
(1) La demande est: http: // localhost: 8768 / h2service / user / 1? Username = chhliu
Le résultat du test est: {"Résultat": "Le mot de passe n'est pas correct!"}
Résultats de l'impression de console
Obtenez une demande AccessUserNameFilter à http: // localhost: 8768 / h2service / user / 1
Obtenez une demande AccessPasswordFilter à http: // localhost: 8768 / h2service / user / 1
Filtre d'accès ACCESSERNAMEFILTER, a échoué lors de la vérification du filtre AccessPasswordFilter
Il n'y a pas d'impression SQL en arrière-plan, ce qui signifie que la demande n'est pas acheminée
(2) La demande est: http: // localhost: 8768 / h2service / user / 1? Motword = 123456
Le résultat du test est: {"résultat": "Le nom d'utilisateur n'est pas correct!"}
Résultats de l'impression sur la console:
Obtenez une demande AccessUserNameFilter à http: // localhost: 8768 / h2service / user / 1
Cela signifie que le filtre AccessUserNameFilter a été atteint, mais le filtre AccessPasswordFilter n'a pas été atteint. Étant donné que le filtre AccessUsernameFilter a une priorité plus élevée, il sera d'abord exécuté. Lors de l'exécution, il est constaté que les conditions du filtre ne se réunissent pas, donc tous les filtres sont ignorés par la suite et le résultat est renvoyé sans l'impression SQL en arrière-plan, indiquant que la demande n'a pas été acheminée.
(3) La demande est: http: // localhost: 8768 / h2service / user / 1? Motword = 123456 & username = chhliu
Les résultats des tests sont:
{
"id": 1,
"nom d'utilisateur": "user1",
"Nom": "Zhang San",
"Age": 20,
"Balance": 100,00
}
Les résultats de l'impression console:
Obtenez une demande AccessUserNameFilter à http: // localhost: 8768 / h2service / user / 1
Obtenez une demande AccessPasswordFilter à http: // localhost: 8768 / h2service / user / 1
Cela signifie que l'accès UsUnSernameFilter est d'abord exécuté, puis le Filter AccessPassword est exécuté. Ceci est cohérent avec plus la valeur de commande que nous avons mentionnée plus tôt est plus tôt, plus la priorité est élevée.
Le service demandé en même temps a une sortie SQL:
HiberNate: sélectionnez user0_.id as id1_0_0_, user0_.age as Age2_0_0_, user0_.balance as bancan3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ de user user0_ où user0_.id =?
Indique que la demande a été acheminée.
4. Allumez le filtre post et exécutez-le à nouveau
Résultat du test: le filtre post s'est avéré être exécuté pour la dernière fois, bien que sa priorité soit 0
Concernant le cycle de vie du filtre de Zuul, voir la figure ci-dessous
Remarque: il y a une petite erreur dans l'image ci-dessus, le routage devrait être une route
5. Développer
Zuul fournit également un type spécial de filtre, à savoir: staticResponseFilter et chirurgicaldebugfilter
StaticResponseFilter: StaticResponseFilter permet la génération de réponses de Zuul elle-même, plutôt que de transmettre la demande à la source.
SurgicalDebugFilter: SurgicalDebugFilter permet d'achever des demandes spécifiques à un cluster ou un hôte de débogage délimité.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.