En tant que service de passerelle, Zuul est une station de transport externe pour d'autres services, et les demandes sont transmises via Zuul. Cela implique que certaines données ne peuvent pas être renvoyées intactes, telles que les informations d'identification pour la communication entre les services, les informations de chiffrement des utilisateurs, etc.
Par exemple, le service utilisateur fournit une interface de connexion. Une fois que le nom d'utilisateur et le mot de passe sont corrects, un jeton est renvoyé. Ce jeton est utilisé comme laissez-passer au service utilisateur. Ensuite, le jeton est retourné après que l'utilisateur se connecte avec succès, il doit être chiffré ou empêché de falsifier. Avant d'arriver à d'autres interfaces du service utilisateur, le jeton doit être vérifié. Les jetons illégaux n'ont pas besoin d'être transmis au service utilisateur et les informations peuvent être renvoyées directement sur la couche de passerelle.
Pour modifier les informations renvoyées par le service, vous devez utiliser le filtre de Zuul. Lorsque vous l'utilisez, vous n'avez qu'à hériter de Zuulfilter et à implémenter les méthodes nécessaires.
Zuul fournit les quatre types de filtres par défaut, qui sont identifiés par la méthode FilterType.
L'ordre dans lequel les filtres sont exécutés sont triés par la méthode du filtre, et plus la valeur est petite, plus elle est préférée. FilterConstants définit l'ordre d'exécution et le type de routage de certaines colonnes de filtres par défaut, et la plupart des constantes qui doivent être utilisées sont ici.
Comme le montre l'exemple, seule l'interface de connexion doit être interceptée, donc seule la demande de connexion (/ utilisateur / connexion) est nécessaire. Vous pouvez utiliser la méthode du filtre devrait-il déterminer si une interception est requise.
Étant donné que la modification des données est effectuée après le succès du service utilisateur, le type d'intercepteur est de type post. La mise en œuvre de toute la classe est la suivante:
classe publique AuthResponseFilter étend AbstractzuulFilter {private static final string réponse_key_token = "token"; @Value ("$ {System.config.authFilter.authurl}") String privé Authurl; @Value ("$ {System.config.authFilter.TokenKey}") String privé TokenKey = Response_Key_Token; @Autowired Private Authapi Authapi; @Override public boolean aitfilter () {requestContext context = getCurrentContext (); return stringUtils.equals (context.getRequest (). getRequeSturi (). toString (), authurl); } @Override public objet run () {try {requestContext context = getCurrentContext (); InputStream stream = context.getResponSedAtasteRam (); String body = streamUtils.copyToString (stream, charset.forname ("utf-8")); if (stringUtils.isnotblank (body)) {gson gson = new gson (); @SuppressWarnings ("Unchecked") 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 ()! = httpservletResponse.sc_ok) {Throw New illégalArgumentException (authResult.getRmsG ()); } String AccessToken = AuthResult.getToken (); result.put (tokenkey, AccessToken); } body = gson.tojson (résultat); } context.setResponseBody (corps); } 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; }} Dans le fichier de configuration, ajoutez l'URL d'autorisation et renvoyez le jeton de clé:
System.Config.authFilter.Authurl = / User / Login
System.config.authFilter.TokenKey = Token
context.setResponseBody (corps); Ce code est central et les données renvoyées sont modifiées via cette méthode.
Lorsque l'utilisateur se connecte avec succès, le chiffrement des jetons est effectué via des services autorisés en fonction du jeton retourné. La méthode de chiffrement utilise ici JWT. Pour empêcher les utilisateurs de falsifier des informations, les demandes illégales peuvent être directement interceptées au niveau de la couche de passerelle.
En ce qui concerne le processus d'exécution du filtre Zuul, il n'est pas nécessaire de l'expliquer ici. Vous pouvez dire en un coup d'œil le code source. ZuulservletFilter:
@Override public void dofilter (ServLetRequest ServletRequest, servletResponse ServletResponse, filterChain filterChain) lance ioException, servlexception {try {init ((httpservletRequest) servletRequest, (httpservLetResponse) ServLetResponse); essayez {prérouting (); } catch (zuulexception e) {error (e); Postrouting (); retour; } // Envoyez uniquement vers la chaîne si une réponse zuul n'est pas envoyée si (! RequestContext.getCurrentContext (). SendzuulResponse ()) {filterchain.dofilter (servLetRequest, servletResponse); retour; } essayez {routing (); } catch (zuulexception e) {error (e); Postrouting (); retour; } essayez {postrouting (); } catch (zuulexception e) {error (new Zuulexception (e, 500, "Uncaught_exception_from_filter_" + e.getClass (). getName ())); } enfin {requestContext.getCurrentContext (). Unset (); }}Description de la méthode:
Le transfert demandé peut être résilié via Context.
Sur la façon de résilier le filtre:
Seuls les filtres pré-type prennent en charge le transfert de terminaison et d'autres filtres sont exécutés en séquence. De plus, les filtres pré-type ne peuvent terminer le transfert qu'après que tous les filtres pré-type sont exécutés. Le filtre ne peut pas être résilié et une exécution continue. Regardez le code source de ZuulservletFilter:
// ne transmet à la chaîne que si une réponse zuul n'est pas envoyée si (! RequestContext.getCurrentContext (). SendzuulResponse ()) {filterChain.dofilter (servletRequest, servletResponse); retour; } Le code de cet article a été soumis à: https://gitee.com/cmlbeliev/springcloud bienvenue à Star
Implémentation de la classe dans: com.cml.springcloud.api.filter.AuthResponseFilter dans le projet API-GETWAY
Adresse locale: http://xz.vevb.com:81/201806/yuanma/cmmlbeliev-springcloud_jb51.rar
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.