Oggi le applicazioni web sono strumenti moderni ed essenziali. Poiché le macchine e i processori diventano sempre più potenti, le applicazioni Web devono soddisfare costantemente i requisiti di prestazione. Ecco perché con 4D v18 R6, il 4D Web Server offre un nuovo tipo di sessione web: la sessione web scalabile.
Scopriamone di più!
In precedenza, si era abituati all’opzione Gestione automatica della sessione nella pagina Web delle Impostazioni struttura. Era comodo mantenere in vita i dati della sessione sul server.
Mentre il server Web di 4D è preemptive e può sfruttare tutti i core disponibili per rispondere ai processi Web, ogni sessione (che rappresenta il browser di un utente finale) veniva gestita attraverso un singolo processo, quindi diverse richieste provenienti contemporaneamente da questo browser venivano gestite in modo sequenziale, una dopo l’altra.
Ora, le sessioni web scalabili sono in grado di gestire diversi processi in modalità preemptive. Ciò significa che le sessioni Web scalabili possono gestire più richieste dell’agente utente contemporaneamente. Questo migliora notevolmente le prestazioni.
E non è tutto! Le nuove sessioni web scalabili possono condividere i dati tra questi processi.
lavorare con le sessioni web scalabili
Volete lavorare con le nuove sessioni web scalabili? Niente di più semplice. È sufficiente attivare le nuove impostazioni web e avviare il server web.
Le sessioni web scalabili sono gestite attraverso un oggetto
Una volta attivata l’impostazione, è possibile gestire la sessione attraverso un oggetto. Il comando nuovo Session restituisce questo oggetto.
È disponibile in qualsiasi processo web attivato da tag 4D, azioni 4D, funzioni REST (ORDA Data Model Classes) e metodi di database come On Web Authentication / On Web Connection.
Grazie a questo oggetto, è possibile gestire molti aspetti della sessione web.
Ecco un esempio di ciò che si vedrà nel debugger:
condividere dati tra processi
Questo Session viene fornito con una storage che è un oggetto condiviso. È possibile memorizzare i dati che si desidera condividere tra le richieste provenienti dall’interprete sulla sessione nella proprietà storage proprietà.
esempio
In questo esempio, abbiamo un’applicazione CRM. Ogni venditore gestisce il proprio portafoglio clienti. Il database contiene due classi di dati collegate: Customers e SalesPersons (un venditore ha più clienti).
Supponiamo che il server Web sia avviato sulla macchina(IP) utilizzando una porta HTTPS(porta).
Quando l’URL IP:port/4DACTION/authenticate?userId=1 viene inserito in un browser web da un venditore, viene chiamato il metodo authenticate.
I primi tre clienti dell’addetto alle vendite vengono memorizzati nella sessione. Ecco il codice del metodo 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")
Quindi, i primi tre sono accessibili da qualsiasi richiesta proveniente dall’interprete (ad esempio, in una pagina SHTML):
<center><h3>I tuoi primi 3 clienti</h3></center>
<table class="table">
<!--#4DCODE
$i:=0
$myTop3:=Session.storage.myTop3
-->
<tr><th>Nome</th><th>Totale acquisto</th></tr>
<!--#4DLOOP ($i<$myTop3.length)-->
<tr>
<td ><!--#4DTEXT $myTop3[$i].name--></td>
<td ><center><!--#4DTEXT $myTop3[$i].totalPurchase--></center></td>
</tr>
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->
</table>
Ecco il risultato:
azioni imminenti con la sessione
Stiamo lavorando a una gestione accurata dei privilegi per il futuro. In modo da poter concedere l’accesso + le operazioni sui dati in base ai privilegi.
Per ora, è possibile inserire le informazioni dell’utente nella sessione grazie alla funzione setPrivileges(). Questa funzione sarà migliorata per gestire più azioni per i privilegi in una prossima versione.
esempio
var $indexUserId
dsSalesPersonsquery $userId: Integer
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)
È quindi possibile personalizzare le pagine web aggiungendo qualcosa di simile:
<center>
<h3>
Hello <!--#4DEVAL Choose(Session.userName # ""; Session.userName; "nobody")-->
</h3>
</center>
Ecco il risultato:
Come avrete notato nella schermata del debugger, le sessioni web scalabili si chiudono (timeout) dopo 60 minuti di inattività (cioè, nessuna richiesta sollecita la sessione).
Scaricate l’HDI qui sopra per saperne di più e partecipate alla discussione sul forum 4D!