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!
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:
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).
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:
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:
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!