Sesiones escalables para aplicaciones web avanzadas

Traducido automáticamente de Deepl

Hoy en día, las aplicaciones web son herramientas modernas esenciales. Como las máquinas y los procesadores son cada vez más potentes, sus aplicaciones web deben cumplir constantemente con los requisitos de rendimiento. Por eso, con 4D v18 R6, el servidor web 4D ofrece un nuevo tipo de sesión web: la sesión web escalable.

¡Descubramos más!

HDI: Sesiones web escalables

Anteriormente, usted estaba acostumbrado a la opción de gestión automática de la sesión en la página web de la configuración de la estructura. Era conveniente mantener los datos de la sesión vivos en el servidor.

Aunque el Servidor Web de 4D es preemptivo y puede aprovechar todos los núcleos disponibles para responder a los procesos web, cada sesión (que representa el navegador de un usuario final) se gestionaba a través de un único proceso, por lo que varias peticiones que llegaban a la vez desde este navegador se gestionaban secuencialmente, una tras otra

Ahora, las sesiones web escalables son capaces de gestionar varios procesos en modo preventivo. Esto significa que las sesiones web escalables pueden gestionar varias peticiones del agente de usuario al mismo tiempo. Esto mejora enormemente el rendimiento.

Y eso no es todo. Estas nuevas sesiones web escalables pueden compartir datos entre estos procesos.

trabajar con sesiones web escalables

¿Quieres trabajar con las nuevas sesiones web escalables? Nada más sencillo. Sólo tiene que activar la nueva configuración web e iniciar su servidor web.

Las sesiones web escalables se manejan a través de un objeto

Una vez que haya activado la configuración, puede manejar la sesión a través de un objeto. El nuevo Session devuelve este objeto.

Está disponible en cualquier proceso web desencadenado por etiquetas 4D, acciones 4D, funciones REST (clases de modelo de datos ORDA) y métodos de bases de datos como On Web Authentication / On Web Connection.

Gracias a este objeto, usted puede manejar muchos aspectos de su sesión web.

Aquí hay un ejemplo de lo que verás en el depurador:

blank

compartir datos entre procesos

Este objeto Session objeto viene con una storage propiedad que es un objeto compartido. Puedes almacenar cualquier dato que quieras compartir entre las peticiones procedentes del agente de usuario en la sesión en la propiedad storage propiedad.

ejemplo

En este ejemplo, tenemos una aplicación CRM. Cada vendedor gestiona su propia cartera de clientes. La base de datos contiene dos clases de datos vinculadas: Customers y SalesPersons (un vendedor tiene varios clientes).

blank

Digamos que su servidor web se inicia en su máquina(IP) utilizando un puerto HTTPS(puerto).

Cuando la URL IP:port/4DACTION/authenticate?userId=1 es introducida en un navegador web por un vendedor, se llama al método authenticate.

Los tres primeros clientes del vendedor se almacenan en la sesión. Este es el código del método authenticate:


var
$indexUserId : Integer
var $userId: Integer
var $info : Object
var $userTop3 : cs.CustomersSelection
var $sales : cs.SalesPersonsEntity
ARRAY TEXT($anames; 0)
ARRAY TEXT ($avalues; 0)

WEB GET VARIABLES
($anames; $avalues)
$indexUserId :=Find in array($anames; "userId")
$userId :=Num($avalues{$indexUserId})
$sales :=ds.SalesPersons.query("userId = :1"; $userId).first()
If ($sales#Null)
Use (Session.storage)
If (Session.storage.myTop3=Null)
$userTop3 :=$sales.customers.orderBy("totalPurchase desc").slice(0; 3)
Session .storage.myTop3:=$userTop3
End if
End use

end if
WEB SEND HTTP REDIRECT ("/sessionStorage.shtml")

A continuación, estos tres primeros son accesibles por cualquier petición procedente del agente de usuario (por ejemplo, en una página SHTML):

<center><h3>Sus 3 principales clientes</h3></center>
<table class="table">
<!--#4DCODE
$i:=0
$myTop3:=Session.storage.myTop3
-->
<tr><th>Nombre</th><th>Total de compras</th></tr>
<!--#4DLOOP ($i<$myTop3.length)-->
<tr>
<td ><!--#4DTEXT $myTop3[$i].name--></td>
<td ><center><!--#4DTEXT $myTop3[$i].totalCompra--></center></td>
</tr>
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->
</table>

Y aquí está el resultado:

blank

próximas acciones con la sesión

Estamos trabajando en una precisa gestión de privilegios para el futuro. De manera que se podrá conceder acceso + operaciones sobre los datos según los privilegios.

Por ahora, puedes poner la información del usuario en la sesión gracias a la función setPrivileges(). Esta función será mejorada para manejar más acciones por privilegios en una futura versión.

ejemplo

var $indexUserId IntegerdsSalesPersonsquery $userId
var $userId : Integer
var $sales : cs.SalesPersonsEntity
var $info : Object
ARRAY TEXT ($anames; 0)
ARRAY TEXT ($avalues; 0)
WEB GET VARIABLES ($anames; $avalues)
$indexUserId :=Find in array($anames; "userId")
$userId :=Num($avalues{$indexUserId})
$sales := xml-ph-0035@deepl.ifirst()
$info :=New object()
$info .userName:=$sales.firstname+" "+$sales.lastname

Session .setPrivileges($info)

Así que usted puede personalizar sus páginas web mediante la adición de algo como esto:

<center>
<h3>
Hola <!--#4DEVAL Choose(Session.userName # ""; Session.userName; "nobody")-->
</h3>
</center>

Aquí está el resultado:

blank

Como habrás notado en la captura de pantalla del depurador, las sesiones web escalables se cierran (timeout) después de 60 minutos de inactividad (es decir, ninguna petición solicita la sesión).

¡Descargue el IDH arriba para descubrir más y únase a la discusión en el foro de 4D!

Avatar
• Propietario de producto - Marie-Sophie Landrieu-Yvert ingresó al equipo de 4D Product como Propietario de producto en 2017. Como tal, está a cargo de escribir las historias de los usuarios y luego traducirlas en especificaciones funcionales. Su papel es también asegurarse de que la implementación de la funcionalidad entregada cumpla con las necesidades del cliente. Marie-Sophie se graduó en la Escuela de Ingeniería de ESIGELEC y comenzó su carrera como ingeniera en IBM en 1995. Participó en varios proyectos (de mantenimiento y creación) y trabajó como desarrolladora de Cobol. Luego trabajó como diseñadora de UML y desarrolladora de Java. Sus principales funciones fueron analizar y redactar requisitos funcionales, coordinar los equipos de negocio y de desarrollo.