You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: readme.md
+124-6
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,7 @@ Como siempre, como mejor se entiende un concepto es realizando un programa y exp
6
6
7
7
En el programa de ejemplo tenemos un controlador para peticiones REST en la clase `PrincipalController.java` que será el encargado de gestionar todas las peticiones.
8
8
9
-
Este es parte del código de la clase.
9
+
Este es el código de la clase:
10
10
11
11
```java
12
12
@RestController
@@ -36,11 +36,38 @@ public class PrincipalController {
En la función `entryOther` se capturaran todas las peticiones tipo **GET** que vayan a alguna URI que no tengamos definidas explícitamente. En la función `entryOne` se procesaran las peticiones tipo **GET** que vayan a la URL http://localhost:8080/one o http://localhost:8080/
43
66
67
+
La clase `sillyLog` es una clase donde simplemente iremos añadiendo líneas de log para luego devolverlas en la petición, de tal manera que podremos ver por donde ha pasado nuestra petición.
68
+
69
+
En esta aplicación se definen dos filtros: `MyFilter.java` y `OtherFilter.java`. El primero tiene preferencia sobre el segundo, por estar así establecido en el parámetro de la etiqueta **@Order**.
70
+
44
71
En el fichero `MyFilter.java` definimos nuestro primer filtro.
45
72
46
73
```java
@@ -63,6 +90,12 @@ public class MyFilter implements Filter{
63
90
chain.doFilter(httpRequest, myResponse);
64
91
return;
65
92
}
93
+
if (httpRequest.getRequestURL().toString().endsWith("/none")) {
myResponse.getOutputStream().println("-- I don't have any to tell you --");
97
+
return; // No hago nada.
98
+
}
66
99
if (httpRequest.getRequestURL().toString().endsWith("/redirect")) {
67
100
myResponse.addHeader("PROFE", "REDIRECTED");
68
101
myResponse.sendRedirect("redirected");
@@ -82,11 +115,36 @@ public class MyFilter implements Filter{
82
115
}
83
116
```
84
117
85
-
Lo primero que tenemos que hacer para definir un filtro *general* es etiquetar la clase con **@Component**.Después deberemos implementar el interface `Filter` .También podríamos extender de la clase `OncePerRequestFilter` la cual implementa el interface `Filter` pero añade ciertas funcionalidades para que un filtro solo se ejecute una vez por ejecución. En este ejemplo vamos a simplificarlo al maximo y directamente implementaremos el interface `Filter`.
Lo primero que tenemos que hacer para definir un filtro *general* es etiquetar la clase con **@Component** . Después deberemos implementar el interface `Filter` . También podríamos extender de la clase `OncePerRequestFilter` la cual implementa el interface `Filter` pero añade ciertas funcionalidades para que un filtro solo se ejecute una vez por ejecución. En este ejemplo vamos a simplificarlo al máximo y directamente implementaremos el interface `Filter`.
Esta función será ejecutada por el contenedor web. En otras palabras: esta función solo es ejecutada una vez, cuando el componente es instanciado por **Spring**.
92
150
@@ -98,7 +156,67 @@ El interface `Filter` define tres funciones.
98
156
99
157
Esta función es llamada por el contenedor web de Spring para indicarle al filtro, que va a dejar de estar activo.
100
158
101
-
En el código del ejemplo nosotros solo utilizaremos la función `doFilter`
159
+
Como he comentado anteriormente, la etiqueta **@Order** nos permitirá especificar el orden en que los filtros serán ejecutados. En este caso, este filtro tendrá el valor 1 y el siguiente tendrá el valor 2, por lo cual `MyFilter` se ejecutara antes que `OtherFilter`
160
+
161
+
La clase `MyFilter` realiza diferentes acciones según la URL llamada. La clase `OtherFilter `solamente añade un log cuando pasa por ella.
162
+
163
+
En el código del ejemplo nosotros solo utilizamos la función `doFilter`. En ella, lo primero, convertimos la clase `ServletResponse` a `HttpServletResponse` y la clase `ServletRequest` a `HttpServletRequest`. Esto es necesario para poder acceder a ciertas propiedades de los objetos que de otra manera no estarían disponibles.
164
+
165
+
Voy a explicar paso a paso los diferentes casos contemplados en la clase `MyFilter`, dependiendo de la URL invocada.
166
+
167
+
-**/one**: Añadimos una cabecera **PROFE** con el valor **FILTERED**. Después ejecutamos la función `doFilter`de la clase `chain` con lo cual se continuara el flujo de la petición. Es decir, se ejecutaría el segundo filtro y después llegaría a la función `entryOne` del controlador, donde podríamos ver que existe un *header* con el valor PROFE, por lo cual se llama a la función entryTwo.
168
+
169
+
Una llamada a esta URL nos devolvería lo siguiente:
La primera línea es devuelta por la función `entryTwo`. A continuación se muestran los logs añadidos.
185
+
186
+
Creo que si se mira el código se ve claro el flujo.
187
+
188
+
-**/redirect** Añadimos una cabecera **PROFE** con el valor **REDIRECTED**. Después especificamos que se debe incluir una redireción a la URL `redirected` con la instrucción `sendRedirect`. Después ejecutamos la función `doFilter` por lo cual se procesara el segundo filtro y se llamara a la función `entryOther` ya que no tenemos ningún punto de entrada definido para */cancel*.
189
+
190
+
191
+
192
+
-**/none** . Establezco el código HTTP a devolver a BAD_GATEWAY y en el cuerpo pongo el texto *"I don't have any to tell you"*. No ejecuto la función `doFilter` por lo cual ni será llamado el segundo filtro, ni seria invocada ninguna llamada del Controlador en caso de que existiera alguno.
193
+
194
+
```curl
195
+
> curl -s http://localhost:8080/none
196
+
-- I don't have any to tell you --
197
+
```
198
+
199
+
-**/cancel** . Establezco el código HTTP a devolver a BAD_REQUEST y en el cuerpo pongo el texto *"Output by filter error"*. Ejecuto la función `doFilter` por lo cual será ejecutado el filtro `OtherFilter` y se pasara por la función `entryOther` ya que no tenemos ningún punto de entrada definido para */cancel*
0 commit comments