1
00:00:00,210 --> 00:00:00,870
Bienvenidos.

2
00:00:00,960 --> 00:00:05,110
Vamos a comenzar una nueva sección sobre interceptores HTTP.

3
00:00:05,190 --> 00:00:05,880
Para qué sirven?

4
00:00:05,910 --> 00:00:08,970
Cómo lo podemos implementar en Spring casos de uso?

5
00:00:09,070 --> 00:00:14,100
Bueno, y también qué tanta relación tiene con nuestros datos, con nuestra lógica negocio, con nuestra

6
00:00:14,160 --> 00:00:14,850
aplicación?

7
00:00:15,870 --> 00:00:16,740
Qué hace un interceptor?

8
00:00:16,830 --> 00:00:23,010
Bueno, lo implementamos y son útiles cuando se recrea aplicar alguna tarea, alguna funcionalidad específica

9
00:00:23,040 --> 00:00:25,200
para ciertas peticiones http.

10
00:00:25,290 --> 00:00:31,140
Cada vez que se ejecuta un método handler de controlador que se encarga de manejar una petición http

11
00:00:31,230 --> 00:00:31,650
se carga.

12
00:00:31,650 --> 00:00:37,290
Este método se ejecuta y podemos envolver este método de ejecución con alguna tarea, algún proceso.

13
00:00:37,350 --> 00:00:41,460
Pero esta tarea no tiene mucha relación directa con la lógica negocio.

14
00:00:41,550 --> 00:00:42,900
Más bien es transversal.

15
00:00:42,990 --> 00:00:44,940
Es para dar algún tipo de soporte.

16
00:00:45,000 --> 00:00:50,670
Por ejemplo, para validar alguna información, validar datos o registrar datos en el Logger.

17
00:00:50,760 --> 00:00:53,850
Manejar transacciones SQL demasiado.

18
00:00:53,880 --> 00:00:54,990
Todo lo que autenticación.

19
00:00:55,020 --> 00:00:56,250
Todo lo que es autorización.

20
00:00:56,340 --> 00:00:59,670
En fin, básicamente validaciones o realizar algún tipo.

21
00:00:59,670 --> 00:01:00,780
Cálculo también.

22
00:01:00,840 --> 00:01:05,130
Por ejemplo, para sistemas de monitoreo o estadístico de nuestra aplicación.

23
00:01:05,220 --> 00:01:06,300
Cuáles son nuestras visitas?

24
00:01:06,330 --> 00:01:08,700
Cuáles son los usuarios que están utilizando la aplicación?

25
00:01:08,790 --> 00:01:10,860
Desde dónde vienen la IP?

26
00:01:11,160 --> 00:01:14,880
En fin, un montón de cosas que podemos registrar en alguna tabla en el log.

27
00:01:15,080 --> 00:01:21,180
Bueno, este fragmento de código se pueden reutilizar, ya que no solamente se pueden aplicar o interceptar

28
00:01:21,240 --> 00:01:24,830
en un método de controlador, sino también en varios controladores, en varios métodos.

29
00:01:25,040 --> 00:01:30,120
Entonces envuelven con una al día, antes o después del método controlador.

30
00:01:31,450 --> 00:01:33,190
Y es que tenemos un ejemplo visual.

31
00:01:33,310 --> 00:01:38,560
Acá tenemos el controlador Font Controller o cualquiera puede ser cualquier controlador, incluso API,

32
00:01:38,560 --> 00:01:45,580
rest o que carga con vista, da lo mismo, pero siempre se va a interceptar este código antes de invocar

33
00:01:45,580 --> 00:01:48,490
el método del controlador que maneja la petición.

34
00:01:48,580 --> 00:01:54,200
Por ejemplo, anotá con Conquest Mapping con post mapping, input mapping con Telehit Mapping en caso

35
00:01:54,200 --> 00:01:59,200
de que estemos con API Rest y también después de ejecutar el método.

36
00:01:59,320 --> 00:02:04,960
Y también hay un tercer evento o método de este interceptor que podemos implementar en una tarea.

37
00:02:05,020 --> 00:02:10,600
Cuando finaliza el proceso completo, es decir, cuando se haya renderizado la vista o cuando se haya

38
00:02:10,600 --> 00:02:12,700
entregado la respuesta al cliente.

39
00:02:13,960 --> 00:02:17,020
Bueno, justamente esto cómo funciona un interceptor?

40
00:02:17,080 --> 00:02:18,220
Cómo lo podemos implementar?

41
00:02:18,310 --> 00:02:22,190
Bueno, a través de una interfaz de Sprint Handler Interceptor.

42
00:02:22,240 --> 00:02:27,580
Pero también la podemos implementar heredando de una clase abstracta que se llama Handler Interceptor

43
00:02:27,580 --> 00:02:30,790
Adapter, un adaptador e implementar alguno de estos métodos.

44
00:02:30,910 --> 00:02:32,950
Bueno, son tres métodos que podemos implementar.

45
00:02:33,070 --> 00:02:39,190
No es obligación implementarlo todos, solamente lo que necesitemos, pero lo más típico e implementar

46
00:02:39,250 --> 00:02:40,000
el presante.

47
00:02:40,360 --> 00:02:46,420
Es decir, antes de que se ejecute o se invoque el método de controlador y el post handler después de

48
00:02:46,420 --> 00:02:48,700
que se haya invocado el método del controlador.

49
00:02:48,820 --> 00:02:55,360
Por lo tanto, con el pre y el post envolvemos con alguna tarea de funcionalidad lo que hace nuestro

50
00:02:55,360 --> 00:02:57,070
request el método controlador.

51
00:02:57,250 --> 00:03:02,590
Bueno, de hecho todo lo que es principie Unity y todo lo que manejo de transacciones de base auto con

52
00:03:02,590 --> 00:03:05,770
Spring con Spring Data JPA ya maneja este tipo de cosas.

53
00:03:05,780 --> 00:03:11,760
Por ejemplo con Spring si que Unity ya tiene su propio interceptores que se encarga por debajo de manejar.

54
00:03:11,770 --> 00:03:17,260
Por ejemplo, si el usuario está autenticado, si el usuario tiene permiso a ciertos recursos, la aplicación

55
00:03:17,350 --> 00:03:22,090
en fin, ya realiza esas tareas están implementadas, aunque también lo podríamos hacer a mano y en

56
00:03:22,090 --> 00:03:23,770
el caso de manejo de transacción.

57
00:03:23,800 --> 00:03:29,920
Todo lo que comí el rollback también a través de interceptores y también con programación, orienta

58
00:03:29,920 --> 00:03:32,980
aspectos que intercepta métodos del service.

59
00:03:33,040 --> 00:03:37,000
Por ejemplo, ya maneja la transacción utilizando la notación transaccional.

60
00:03:37,080 --> 00:03:43,180
Entonces también puedo manejar el comit el rollback en caso de error también lo podemos hacer con interceptores,

61
00:03:43,270 --> 00:03:45,520
pero como digo ya viene implementado no necesario.

62
00:03:45,670 --> 00:03:50,770
Y un tercer método After Complicarán, que cuando finaliza el proceso completo, cuando se carga la

63
00:03:50,770 --> 00:03:57,040
vista y se renderiza esta vista en el navegador, me entrega un detalle el handler es un método que

64
00:03:57,040 --> 00:03:59,410
retorna un boli, no ese true o false.

65
00:03:59,540 --> 00:04:01,330
Bueno, si retorna true perfecto.

66
00:04:01,480 --> 00:04:06,250
Continúa con la ejecución de controlador de forma normal y también si tiene más interceptores, continúa

67
00:04:06,250 --> 00:04:12,820
con la ejecución en cadena de lo demás interceptores que está dentro del stack de interceptores de nuestra

68
00:04:12,820 --> 00:04:13,300
aplicación.

69
00:04:13,390 --> 00:04:14,800
Pero qué pasa si retorna false?

70
00:04:14,950 --> 00:04:19,000
Bueno, obviamente no ejecuta el controlador menos su método.

71
00:04:19,060 --> 00:04:20,470
Andrés finaliza proceso.

72
00:04:20,590 --> 00:04:27,250
El Interceptor se encarga o se hace cargo del rico test y lo maneja, por ejemplo, redirigiendo hacia

73
00:04:27,340 --> 00:04:32,410
otra ruta o cargar otra vista con algún mensaje, con alguna funcionalidad.

74
00:04:32,500 --> 00:04:33,340
Bueno, lo típico.

75
00:04:33,340 --> 00:04:39,370
Por ejemplo, cuando el usuario no tiene sesión y detecta que no está autenticado, bueno, el interceptor

76
00:04:39,490 --> 00:04:45,790
o el filtro redirige hacia la página login para iniciar sesión, por poner un ejemplo o si el usuario

77
00:04:45,880 --> 00:04:46,670
no tiene permiso.

78
00:04:46,690 --> 00:04:53,380
Por ejemplo, un usuario está autenticado y tiene un rol usuario pero no admin y esta página o recurso

79
00:04:53,470 --> 00:04:55,330
necesita ser administrador.

80
00:04:55,420 --> 00:05:02,740
Bueno, entonces en vez de ejecutar el CRUD y DA permiso, lo que hace es redirigir a una vista con

81
00:05:02,740 --> 00:05:09,460
un mensaje que diga por ejemplo, no tiene acceso o permiso a esta funcionalidad o acceso restringido,

82
00:05:09,580 --> 00:05:10,120
por ejemplo.

83
00:05:10,300 --> 00:05:15,910
Bien, pero el método ponja handler que se ejecuta o podemos implementar algo después de que se haya

84
00:05:15,910 --> 00:05:21,880
invocado el método handler del controlador, alguna tarea, algún proceso justo después y retorna voy

85
00:05:22,000 --> 00:05:23,200
y el after complicarán.

86
00:05:23,260 --> 00:05:27,950
Cuando finaliza todo y se renderiza la vista, se carga en el navegador al usuario.

87
00:05:28,120 --> 00:05:34,120
Pero recuerden, es muy importante que cualquier tarea o funcionalidad de nuestro interceptor tiene

88
00:05:34,120 --> 00:05:37,390
que ser transversal a nuestra lógica negocio, a nuestra aplicación.

89
00:05:37,480 --> 00:05:40,660
No tiene una relación directa, es solamente de apoyo.

90
00:05:40,720 --> 00:05:46,390
Tal como explicaba para guardar cosas en el log, en la bitácora, validar sesiones de usuario, realizar

91
00:05:46,390 --> 00:05:51,730
validaciones digoque tipo manejo, transacción, pero al final no está relacionado con otro dato de

92
00:05:51,730 --> 00:05:52,360
forma directa.

93
00:05:52,520 --> 00:05:56,790
Bien, vamos a implementar nuestro interceptor, nos vamos al hide.

94
00:05:57,070 --> 00:06:03,130
Y para este ejemplo la idea es calcular cuánto se demora en cargar una página, es decir, cuánto se

95
00:06:03,130 --> 00:06:08,770
demora en procesar el request, encargar el controlador con el método András en milisegundos.

96
00:06:08,890 --> 00:06:14,410
Entonces un interceptor que calcule el tiempo transcurrido del request de la petición.

97
00:06:14,500 --> 00:06:20,470
Vamos a usar el mismo proyecto Spring Boot Formulario que estamos usando la sesión anterior de formulario.

98
00:06:20,800 --> 00:06:22,110
Bien, vamos a crear un РАМКАХ.

99
00:06:25,060 --> 00:06:33,820
En la raíz del РАМКАХ principal en AP interceptores o interceptores, como queramos finalizar.

100
00:06:34,940 --> 00:06:39,260
Vamos a crear nuestro interceptor, una clase común y corriente, como siempre.

101
00:06:40,550 --> 00:06:42,770
Tiempo transcurrido, interceptor

102
00:06:46,730 --> 00:06:47,380
finalizar.

103
00:06:48,950 --> 00:06:55,910
Bien había explicado en la introducción que debe implementar la interfaz handler interceptor handler

104
00:06:55,970 --> 00:07:00,230
se refiere a los métodos de controlador al mantener request

105
00:07:04,400 --> 00:07:11,570
importamos y bueno, por acá click derecho sources sobrescribir o guerray por acá.

106
00:07:12,470 --> 00:07:13,820
Y acá están los tres métodos.

107
00:07:14,090 --> 00:07:20,180
After compli chón, post, handler post andele y Andrè S.

108
00:07:20,300 --> 00:07:25,700
Después, después de que se haya ejecutado manejado el método controlador, el request y pre.

109
00:07:25,820 --> 00:07:29,960
Antes bien, vamos a marcar solamente el pre y el post, nada más.

110
00:07:30,920 --> 00:07:31,340
Oke?

111
00:07:32,350 --> 00:07:37,030
Entonces, pre antes y post después, esto acá lo vamos a quitar.

112
00:07:38,150 --> 00:07:40,970
Vamos a retornar Trum Trum por ahora.

113
00:07:42,440 --> 00:07:47,360
Bueno, recuerden que cuando es thru, cuando retornamos expoliando thru continúa con la ejecución normal

114
00:07:47,450 --> 00:07:50,930
de nuestra aplicación del controlador y de los demás interceptores.

115
00:07:51,050 --> 00:07:52,100
Si retorna fols.

116
00:07:52,160 --> 00:07:57,410
Falso, por ejemplo por alguna validación, el usuario, por poner un ejemplo, no está autenticado

117
00:07:57,500 --> 00:08:01,040
o falló alguna validación que implementamos cualquier cosa.

118
00:08:01,100 --> 00:08:02,090
Bueno, si es fols.

119
00:08:02,120 --> 00:08:07,460
Termina con la ejecución y no continúa con el controlador ni tampoco con los demás interceptores.

120
00:08:07,550 --> 00:08:08,660
Queda hasta acá nomás.

121
00:08:08,750 --> 00:08:15,530
Y podemos implementar, por ejemplo, un re direct para redirigir a otra ruta o página que se encargue

122
00:08:15,530 --> 00:08:17,120
de manejar este problema.

123
00:08:17,180 --> 00:08:22,430
Por ejemplo, la página de login para iniciar sesión y esto lo dejamos como pait, nada más.

124
00:08:22,600 --> 00:08:28,400
Ya iún interceptor también se puede anotar con component para que lo podamos inyectar después.

125
00:08:28,460 --> 00:08:33,560
Bueno, después vamos a ver que lo podemos inyectar en una clase configuración para poder registrarlo

126
00:08:33,650 --> 00:08:34,550
y configurarlo.

127
00:08:36,500 --> 00:08:37,410
Entonces component.

128
00:08:37,790 --> 00:08:40,370
Iniciando con mayúscula y listo.

129
00:08:40,860 --> 00:08:47,990
Bien, entonces acá recibe el recuas el response en cada uno de los métodos, pero acá en el pre recibe

130
00:08:48,080 --> 00:08:49,460
el método el jantes.

131
00:08:49,520 --> 00:08:54,740
Por ejemplo, el objeto que representa el método del controlador que se está invocando, que se está

132
00:08:54,830 --> 00:08:55,590
ejecutando.

133
00:08:55,700 --> 00:09:01,340
Y acá tenemos toda la información del método, el nombre, los argumentos, las anotaciones, todo.

134
00:09:01,460 --> 00:09:04,910
Y podemos trabajar en base a estos parámetros y por acá.

135
00:09:04,980 --> 00:09:07,840
Bueno, también tiene el handler, el response, el recuerdo.

136
00:09:08,150 --> 00:09:13,960
Por ejemplo, en ambos casos Rickles y el response para trabajar con la petición y la respuesta o tener

137
00:09:13,970 --> 00:09:17,450
parámetros, asignar parámetros, redirigir con directo.

138
00:09:17,600 --> 00:09:18,830
En fin, un montón de cosas.

139
00:09:18,890 --> 00:09:23,240
Y además acá obtiene el model ANBU para pasar datos a la vista.

140
00:09:23,300 --> 00:09:28,910
Por ejemplo, en nuestro caso vamos a pasar el tiempo calculado en que se demoró en ejecutar el recuas.

141
00:09:29,030 --> 00:09:33,920
Lo pasamos a la vista y lo podemos mostrar, por ejemplo en nuestras plantillas, en el formulario,

142
00:09:34,010 --> 00:09:40,400
en la página de detalle o resultado, o en cualquier parte de nuestra aplicación, en cualquier vista

143
00:09:40,400 --> 00:09:42,110
o plantilla de nuestra aplicación.

144
00:09:42,230 --> 00:09:42,830
Nada más.

145
00:09:42,920 --> 00:09:44,620
Nos vemos en la siguiente clase.
