Como serviço de gateway, a Zuul é uma estação de trânsito externa para outros serviços, e as solicitações são encaminhadas através da Zuul. Isso envolve que alguns dados não podem ser retornados intactos, como credenciais para comunicação entre serviços, informações de criptografia do usuário etc.
Por exemplo, o serviço do usuário fornece uma interface de login. Depois que o nome de usuário e a senha estão corretos, um token é retornado. Este token é usado como um passe para o serviço do usuário. Em seguida, o token retornou depois que o usuário efetua login com sucesso, ele precisa ser criptografado ou impedido de adulterar. Antes de chegar a outras interfaces do serviço do usuário, o token precisa ser verificado. Os tokens ilegais não precisam ser encaminhados ao serviço do usuário, e as informações podem ser retornadas diretamente na camada de gateway.
Para modificar as informações retornadas pelo serviço, você precisa usar o filtro de Zuul. Ao usá -lo, você só precisa herdar o Zuulfilter e implementar os métodos necessários.
O Zuul fornece os quatro tipos de filtro padrão, que são identificados pelo método FilterType.
A ordem em que os filtros são executados é classificada pelo método do FilterOrder e quanto menor o valor, mais preferido é. O FilterConstants define a ordem de execução e o tipo de roteamento de algumas colunas de filtros padrão e a maioria das constantes que precisam ser usadas estão aqui.
Conforme mostrado no exemplo, apenas a interface de login precisa ser interceptada; portanto, apenas a solicitação de login (/usuário/login) é necessária. Você pode usar o método de Filter deve determinar se é necessária uma interceptação.
Como a modificação dos dados é feita após o sucesso do serviço do usuário, o tipo de interceptor é o tipo de postagem. A implementação de toda a classe é a seguinte:
classe pública AuthResponseFilter estende abstratazuulfilter {private estático final string Response_key_token = "Token"; @Value ("$ {System.config.authfilter.authurl}") private string authurl; @Value ("$ {System.config.authfilter.tokenKey}") private string tokenkey = resposta_key_token; @Autowired Private Autorapi authapi; @Override public boolean devefilter () {requestContext context = getCurrentContext (); return stringUtils.equals (context.getRequest (). getRequesturi (). tostring (), authurl); } @Override public Object run () {try {requestContext context = getCurrentContext (); InputStream stream = context.getResponsedAtAtream (); String body = streamutils.copyToString (Stream, charset.ForName ("UTF-8")); if (stringutils.isnotblank (corpo)) {gson gson = new gson (); @Suppresswarnings ("desmarcado") mapa <string, string> resultado = gson.fromjson (corpo, map.class); if (stringUtils.isnotblank (resultado.get (tokenkey))) {authmodel authResult = authapi.encodeToken (resultado.get (tokenkey)); if (authResult.getStatus ()! = httpServletResponse.sc_ok) {lança new ilegalargumentException (authResult.geterrrsg ()); } String accessToken = authResult.getToken (); resultado.put (tokenkey, accessToken); } corpo = gson.tojson (resultado); } context.setResponseBody (corpo); } catch (ioexception e) {repenswRuntimeException (e); } retornar nulo; } @Override public String filterType () {return filterconstants.post_type; } @Override public int filterOrder () {return filterconstants.send_Response_filter_order - 2; }} No arquivo de configuração, adicione o URL de autorização e retorne o token -chave:
system.config.authfilter.authurl =/user/login
system.config.authfilter.tokenKey = token
context.setResponseBody (corpo); Esse código é núcleo e os dados retornados são modificados através deste método.
Quando o usuário efetua login com sucesso, a criptografia de token é realizada através de serviços autorizados com base no token retornado. O método de criptografia aqui usa o JWT. Para impedir que os usuários adulterem as informações, solicitações ilegais podem ser interceptadas diretamente na camada de gateway.
Em relação ao processo de execução do filtro Zuul, não há necessidade de explicá -lo aqui. Você pode dizer rapidamente o código -fonte. ZuulservletFilter:
@Override Public void Dofilter (servletRequest servletRequest, servletResponse servletResponse, filterchain FilterChain) lança IoException, servleTexception {try {init (httpServleTrequest) servletRequest, (httpsletResposição)); tente {preroting (); } catch (zuulException e) {error (e); postouting (); retornar; } // Avançar apenas para a cadeia se uma resposta zuul não estiver sendo enviada se (! RequestContext.getCurrentContext (). SendzuulResponse ()) {filterChain.dofilter (servletRequest, servletResponse); retornar; } tente {roting (); } catch (zuulException e) {error (e); postouting (); retornar; } tente {postrouting (); } catch (zuulException e) {error (new zuulException (e, 500, "UNPAGHT_EXCECTION_FROM_FILTER_" + E.GetClass (). getName ())); } finalmente {requestcontext.getCurrentContext (). Unset (); }}Descrição do método:
O encaminhamento solicitado pode ser encerrado através do context.SeStendZuulResponse (false), mas só pode ser definido em filtros pré-tipo.
Sobre como encerrar o filtro:
Somente o encaminhamento de rescisão de suporte aos filtros pré-tipo e outros filtros são executados em sequência. Além disso, os filtros pré-tipo só podem encerrar o encaminhamento após a execução de todos os filtros pré-tipo. O filtro não pode ser encerrado e a execução contínua. Veja o código fonte ZuulservletFilter:
// Avançar apenas para a cadeia se uma resposta zuul não estiver sendo enviada se (! RequestContext.getCurrentContext (). SendzuulResponse ()) {filtrhain.dofilter (servletRequest, servletResponse); retornar; } O código deste artigo foi enviado para: https://gitee.com/cmlbeliev/springcloud bem -vindo ao Star
Implementando a classe em: com.cml.springcloud.api.filter.AuthResponseFilter sob o projeto API-Getway
Endereço local: http://xz.vevb.com:81/201806/yuanma/cmmlbeliev-springcloud_jb51.rar
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.