No exemplo anterior, usamos o Zuul para construir um gateway //www.vevb.com/article/133235.htm
Não vou entrar em detalhes sobre o papel dos gateways aqui. Nosso foco hoje é o filtro de Zuul. Por meio do filtro, podemos implementar o controle de segurança, por exemplo, apenas clientes com nome de usuário e senha nos parâmetros de solicitação podem acessar os recursos do servidor. Então, como implementar o filtro?
Para implementar o filtro, são necessárias as seguintes etapas:
1. Herite a classe Zuulfilter. Para verificar as características do filtro, criamos 3 filtros aqui.
Filtre por nome de usuário
pacote com.chhliu.springcloud.zuul; importar javax.servlet.http.httpServletRequest; importação com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; classe pública AccessuserNameFilter estende o zuulfilter {@Override public Object run () {requestContext ctx = requestContext.getCurrentContext (); HttpServletRequest request = ctx.getRequest (); System.out.println (string.format (" %s accessuserNameFilter request to %s", request.getMethod (), request.getRequesturl (). Tostring ())); String userName = request.getParameter ("nome de usuário"); // Obtenha o parâmetro solicitado se (null! = Nome de usuário && username.equals ("chhliu")) {// se o parâmetro solicitado não estiver vazio e o valor é chhliu, use ctx.SetSENSESSOSSOSSONSSONSONSOSSON; ctx.set ("issuccess", true); // Defina o valor para permitir que o próximo filtro veja o status do retorno do filtro anterior nulo; } else {ctx.setsendzuulResponse (false); // filtre a solicitação e não a direcione ctx.setResponsestatuscode (401); // retorna o código de erro ctx.setResponseBody, "{/" resultado/":/" username não é correto! ""} "); retornar nulo; }} @Override public boolean devefilter () {return true; // Se você deve executar o filtro, é verdade aqui, indicando que a filtragem é necessária} @Override public Int Filterorder () {return 0; // a prioridade é 0, maior o número, menor a prioridade} @override string filtro string () {maior o número, o número mais baixo da prioridade} @Override String filtro () {mais maior, o número mais priority} @verride Ao herdar Zuulfilter e substituir os 4 métodos acima, você pode implementar um filtro simples. A seguir, é apresentada uma descrição dos pontos de atenção relevantes.
FILTERTYPE: Retorna uma string representando o tipo de filtro. Quatro tipos de filtro com diferentes ciclos de vida são definidos em Zuul, como segue:
O ciclo de vida principal do Solicitação de Zuul inclui estágios como "Pre", "Route" e "Post". Para cada solicitação, todos os filtros com esses tipos são executados.
FilterOrder: Define a ordem de execução dos filtros através do INT Value
deve filter: retorna um tipo booleano para determinar se o filtro deve ser executado, para que essa função possa implementar a mudança do filtro. No exemplo acima, retornamos diretamente true, então o filtro sempre entra em vigor
Execute: a lógica específica do filtro. Deve -se notar que aqui usamos o CTX.SetSendzuulResponse (false) para filtrar a solicitação e não a rotear e definir o código de erro que ele retorna através do CTX.SetResponsestatuscode (401).
Coordenação entre filtros
Não existe uma maneira direta para os filtros se acessam. Eles podem usar o requestContext para compartilhar o estado, que é uma estrutura semelhante a um mapa com alguns métodos de acessórios explícitos para os primitivos considerados Zuul. Eles são implementados internamente usando o Threadlocal. Os alunos interessados podem verificar o código -fonte.
Crie outro filtro e filtro de acordo com a senha:
pacote com.chhliu.springcloud.zuul; importar javax.servlet.http.httpServletRequest; importação com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; public class AccessPasswordFilter estende zuulfilter {@Override public Object run () {requestContext ctx = requestContext.getCurrentContext (); HttpServletRequest request = ctx.getRequest (); System.out.println (string.format (" %s accessPasswordFilter solicitação para %s", request.getMethod (), request.getRequesturl (). Tostring ())); String userName = request.getParameter ("senha"); if (null! = Nome de usuário && userName.equals ("123456")) {ctx.setendzuulResponse (true); ctx.setResponsestatuscode (200); ctx.set ("issuccess", verdadeiro); retornar nulo; } else {ctx.setsendzuulResponse (false); ctx.setResponsestatuscode (401); ctx.setResponseBody ("{/" resultado/":/" senha não está correta!/"}"); ctx.set ("Issuccess", false); retornar nulo; }} @Override public boolean devefilter () {requestContext ctx = requestcontext.getCurrentContext (); Return (boolean) ctx.get ("issuccess"); // Se o resultado do filtro anterior for verdadeiro, significa que o filtro anterior foi bem -sucedido e precisa inserir o filtro atual. Se o resultado do filtro anterior for falso, significa que o filtro anterior não foi bem -sucedido. Não há necessidade de executar a seguinte ação de filtragem. Pule todos os filtros subsequentes e retorne o resultado} @Override public int filterorder () {return 1; // prioridade definida como 1} @Override public String filterType () {return "pre"; }} Crie um filtro de postagem no final
pacote com.chhliu.springcloud.zuul; importar javax.servlet.http.httpServletRequest; importação com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; classe pública AccessTokenFilter estende o zuulfilter {@Override public Object run () {requestContext ctx = requestcontext.getCurrentContext (); HttpServletRequest request = ctx.getRequest (); System.out.println (string.format (" %s AccessTokenFilter solicitação para %s", request.getMethod (), request.getRequesturl (). Tostring ())); ctx.setsendzuulResponse (true); ctx.setResponsestatuscode (200); ctx.setResponseBody ("{/" name/":/" chhliu/"}"); // emitir o resultado final retornar null; } @Override public boolean devefilter () {return true; } @Override public int filterOrder () {return 0; } @Override public String filterType () {return "post"; // Depois que a solicitação for processada, o filtro será inserido}} 2. Na classe principal, primeiro atire nos dois primeiros filtros
@Bean public AccessUserNameFilter AccessUserNameFilter () {return New AccessuserNameFilter (); } @Bean public AccessPasspordFilter AccessPasswordFilter () {return new AccessPasswordFilter (); } 3. Digite a solicitação e verifique
(1) A solicitação é: http: // localhost: 8768/h2service/user/1? Nome de usuário = chhliu
O resultado do teste é: {"resultado": "A senha não está correta!"}
Resultados da impressão do console
Obtenha o AccessuserNameFilter Solicy to http: // localhost: 8768/h2service/user/1
Obtenha AccessPasswordFilter Solicy to http: // localhost: 8768/h2service/user/1
Filtro de acesso ACCESSUSERNAMEFILTER, falhou ao verificar o filtro AccessPasswordFilter
Não há impressão SQL em segundo plano, o que significa que a solicitação não está roteada
(2) A solicitação é: http: // localhost: 8768/h2service/user/1? Senha = 123456
O resultado do teste é: {"resultado": "O nome de usuário não está correto!"}
Resultados da impressão do console:
Obtenha o AccessuserNameFilter Solicy to http: // localhost: 8768/h2service/user/1
Isso significa que o filtro AccessuserNameFilter foi atingido, mas o filtro AccessPasswordFilter não foi atingido. Como o filtro AccessuserNameFilter tem maior prioridade, ele será executado primeiro. Ao executar, verifica -se que as condições do filtro não se encontram; portanto, todos os filtros depois são ignorados e o resultado é retornado sem a impressão SQL em segundo plano, indicando que a solicitação não foi roteada.
(3) A solicitação é: http: // localhost: 8768/h2service/user/1?
Os resultados dos testes são:
{
"ID": 1,
"Nome de usuário": "User1",
"Nome": "Zhang San",
"Idade": 20,
"Equilíbrio": 100,00
}
Os resultados da impressão do console:
Obtenha o AccessuserNameFilter Solicy to http: // localhost: 8768/h2service/user/1
Obtenha AccessPasswordFilter Solicy to http: // localhost: 8768/h2service/user/1
Isso significa que o AccessuserNameFilter é executado primeiro e, em seguida, o AccessPasswordFilter é executado. Isso é consistente com o menor valor do pedido que mencionamos anteriormente, maior a prioridade.
O serviço solicitado ao mesmo tempo possui saída SQL:
Hibernate: selecione User0_.id como ID1_0_0_, User0_.age como Age2_0_0_, User0_.Balance como balance3_0_0_, user0_.name como name4_0_0_, user0_.username como username5_0_0_ de usuário de user0_ onde user0_.id =?
Indica que a solicitação foi roteada.
4. Ligue o filtro de postagem e execute -o novamente
Resultado do teste: o filtro post foi encontrado pela última vez, embora sua prioridade seja 0
Em relação ao ciclo de vida do filtro de Zuul, veja a figura abaixo
Nota: Há um pequeno erro na imagem acima, o roteamento deve ser rota
5. Expanda
Zuul também fornece um tipo especial de filtro, a saber: StaticResponseFilter e SurgicalDebugfilter
StaticResponseFilter: StaticResponseFilter permite a geração de respostas do próprio Zuul, em vez de encaminhar a solicitação para a fonte.
SurgicalDebugFilter: SurgicalDebugFilter permite rotear solicitações específicas para um cluster ou host delimitado de depuração.
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.