En el ejemplo anterior, utilizamos Zuul para construir una puerta de enlace //www.vevb.com/article/133235.htm
No voy a entrar en detalles sobre el papel de las puertas de enlace aquí. Nuestro enfoque hoy es el filtro de Zuul. A través del filtro, podemos implementar el control de seguridad, por ejemplo, solo los clientes con nombre de usuario y contraseña en los parámetros de solicitud pueden acceder a los recursos del servidor. Entonces, ¿cómo implementar el filtro?
Para implementar el filtro, se requieren los siguientes pasos:
1. Heredar la clase Zuulfilter. Para verificar las características del filtro, creamos 3 filtros aquí.
Filtrar por nombre de usuario
paquete com.chhliu.springcloud.zuul; import javax.servlet.http.httpservletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; Public Class AccessUsernameFilter extiende Zuulfilter {@Override Public Object run () {requestContext ctx = requestContext.getCurrentContext (); HttpservletRequest request = ctx.getRequest (); System.out.println (String.Format (" %S AccessUsernameFilter Solicitud a %s", request.getMethod (), request.getRequestUrl (). ToString ())); String username = request.getParameter ("username"); // Obtenga el parámetro solicitado if (null! = Username && username.equals ("chhliu")) {// si el parámetro solicitado no está vacío y el valor es chhliu, luego use ctx.setsendzuulResponse (verdadero); // ctx.setResponseStatatatateSconseSconseN (200); ctx.set ("issuccess", true); // Establezca el valor para permitir que el siguiente filtro vea el estado del filtro anterior return null; } else {ctx.setsendzuulResponse (false); // filtra la solicitud y no la enruta ctx.setResponseStatUscode (401); // Devuelve el código de error ctx.setResponseBody ("{/" resultado/":/" UserNeN no correcto!/"}");//devuelve el contenido de error ctx.set ("issuccess", no es correcto! regresar nulo; }} @Override public boolean debería serfilter () {return true; // Si para ejecutar el filtro, es verdadero aquí, lo que indica que el filtrado es necesario} @Override public int filterorder () {return 0; // La prioridad es 0, mayor es el número, menor prioridad} @Override public String FilterType () {return "pre"; // prefilter}} Al heredar Zuulfilter y sobrescribir los 4 métodos anteriores, puede implementar un filtro simple. La siguiente es una descripción de los puntos de atención relevantes.
FilterType: devuelve una cadena que representa el tipo de filtro. Cuatro tipos de filtros con diferentes ciclos de vida se definen en Zuul, de la siguiente manera:
El ciclo de vida principal de la solicitud de Zuul incluye etapas como "pre", "ruta" y "post". Para cada solicitud, se ejecutan todos los filtros con estos tipos.
FilterOrder: Define la orden de ejecución de los filtros a través del valor INT
Deber Filter: Devuelve un tipo booleano para determinar si el filtro se ejecutará, para que esta función pueda implementar el interruptor del filtro. En el ejemplo anterior, devolvemos directamente verdadero, por lo que el filtro siempre entra en vigencia
Ejecutar: la lógica específica del filtro. Cabe señalar que aquí usamos CTX.SetSendZuulResponse (FALSE) para filtrar la solicitud, y no enrutarla, y luego establecer el código de error que devuelve a través de CTX.SetResponseStatUscode (401).
Coordinación entre filtros
No hay forma directa para que los filtros se accedan entre sí. Pueden usar requestContext para compartir el estado, que es una estructura similar al mapa con algunos métodos de accesorios explícitos para primitivas consideradas Zuul. Se implementan internamente utilizando ThreadLocal. Los estudiantes interesados pueden consultar el código fuente.
Cree otro filtro y filtro de acuerdo con la contraseña:
paquete com.chhliu.springcloud.zuul; import javax.servlet.http.httpservletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; Public Class AccessPassWordFilter extiende Zuulfilter {@Override public Object run () {requestContext ctx = requestContext.getCurrentContext (); HttpservletRequest request = ctx.getRequest (); System.out.println (String.Format (" %s AccessPasswordFilter Solicitud a %s", request.getMethod (), request.getRequestUrl (). ToString ())); String UserName = request.getParameter ("Password"); if (null! = username && username.equals ("123456")) {ctx.setsendzuulResponse (true); CTX.SetResponseStatuscode (200); ctx.set ("issuccess", verdadero); regresar nulo; } else {ctx.setsendzuulResponse (falso); ctx.setResponseStatuscode (401); ctx.setResponseBody ("{/" resultado/":/" La contraseña no es correcta!/"}"); ctx.set ("issuccess", falso); regresar nulo; }} @Override public boolean deberíafilter () {requestContext ctx = requestContext.getCurrentContext (); return (boolean) ctx.get ("issuccess"); // Si el resultado del filtro anterior es verdadero, significa que el filtro anterior ha tenido éxito y necesita ingresar el filtro actual. Si el resultado del filtro anterior es falso, significa que el filtro anterior no ha tenido éxito. No hay necesidad de realizar la siguiente acción de filtrado. Omita todos los filtros posteriores y devuelva el resultado} @Override public int filterOrder () {return 1; // prioridad establecida en 1} @Override public String filtType () {return "pre"; }} Crear un filtro de publicación al final
paquete com.chhliu.springcloud.zuul; import javax.servlet.http.httpservletRequest; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; Public Class AccessTokenFilter extiende Zuulfilter {@Override public Object run () {requestContext ctx = requestContext.getCurrentContext (); HttpservletRequest request = ctx.getRequest (); System.out.println (String.Format (" %S AccessTokenFilter Solicitud a %s", request.getMethod (), request.getRequestUrl (). ToString ())); ctx.setsendzuulResponse (verdadero); CTX.SetResponseStatuscode (200); ctx.setResponseBody ("{/" name/":/" chhliu/"}"); // emite el resultado final return null; } @Override public boolean deberíafilter () {return true; } @Override public int filterOrder () {return 0; } @Override public String filtType () {return "post"; // Después de procesar la solicitud, el filtro se ingresará}} 2. En la clase principal, primero encienda los dos primeros filtros
@Bean Public AccessUsernameFilter AccessUsernameFilter () {return New AccessUsernameFilter (); } @Bean Public AccessPassPasswordFilter AccessPassPassFilter () {return New AccessPassWordFilter (); } 3. Ingrese la solicitud y verifique
(1) La solicitud es: http: // localhost: 8768/h2service/user/1? Username = chhliu
El resultado de la prueba es: {"resultado": "¡La contraseña no es correcta!"}
Resultados de impresión de consola
Obtenga Solicitud de AccessUsernameFilter a http: // localhost: 8768/h2service/user/1
Obtenga la solicitud AccessPasswordFilter a http: // localhost: 8768/h2service/user/1
Filtro accessuSerNameFilter pasado, falló al verificar el filtro AccessPasswordFilter
No hay impresión SQL en segundo plano, lo que significa que la solicitud no está enrutada
(2) La solicitud es: http: // localhost: 8768/h2service/user/1? Contraseña = 123456
El resultado de la prueba es: {"resultado": "¡El nombre de usuario no es correcto!"}
Resultados de la impresión de la consola:
Obtenga Solicitud de AccessUsernameFilter a http: // localhost: 8768/h2service/user/1
Significa que se ha alcanzado el filtro AccessUsernameFilter, pero no se ha alcanzado el filtro AccessPasswordFilter. Debido a que el filtro AccessUsernameFilter tiene mayor prioridad, se ejecutará primero. Al ejecutar, se encuentra que las condiciones del filtro no cumplen, por lo que se omiten todos los filtros después y el resultado se devuelve sin impresión SQL en segundo plano, lo que indica que la solicitud no se ha enrutado.
(3) La solicitud es: http: // localhost: 8768/h2service/user/1? Contraseña = 123456 & username = chhliu
Los resultados de la prueba son:
{
"ID": 1,
"Nombre de usuario": "User1",
"Nombre": "Zhang San",
"Edad": 20,
"Balance": 100.00
}
Los resultados de la impresión de la consola:
Obtenga Solicitud de AccessUsernameFilter a http: // localhost: 8768/h2service/user/1
Obtenga la solicitud AccessPasswordFilter a http: // localhost: 8768/h2service/user/1
Esto significa que el accessUsernameFilter se ejecuta primero y luego se ejecuta AccessPassWordFilter. Esto es consistente con cuanto menor es el valor de pedido que mencionamos anteriormente, mayor será la prioridad.
El servicio solicitado al mismo tiempo tiene salida SQL:
Hibernate: seleccione User0_.id como ID1_0_0_, user0_.age como AGE2_0_0_, user0_.balance como balance3_0_0_, user0_.name as name4_0_0_, user0_.username como username5_0_ de usuarios de usuario 0_ donde user0_.id =?
Indica que la solicitud fue enrutada.
4. Encienda el filtro de poste y vuelva a ejecutarlo
Resultado de la prueba: se encontró que el filtro posterior se ejecutaron por última vez, aunque su prioridad es 0
Con respecto al ciclo de vida del filtro de Zuul, vea la figura a continuación
Nota: Hay un pequeño error en la imagen de arriba, el enrutamiento debe ser ruta
5. Expandir
Zuul también proporciona un tipo especial de filtro, a saber: staticResponseFilter y SurgicalDebugfilter
StaticResponseFilter: StaticResponseFilter permite la generación de respuestas del propio Zuul, en lugar de reenviar la solicitud a la fuente.
SurgicalDebugfilter: SurgicalDebugfilter permite enrutar solicitudes específicas a un clúster o host delimitado de depuración.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.