Sessioni scalabili per applicazioni web avanzate

Tradotto automaticamente da Deepl

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ù!

HDI: sessioni web scalabili

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:

blank

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

blank

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:

blank

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:

blank

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!

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert è entrata a far parte del team 4D Product come Product Owner nel 2017. In qualità di Product Owner, è incaricata di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente.Marie-Sophie si è laureata presso la scuola di ingegneria ESIGELEC e ha iniziato la sua carriera come ingegnere presso IBM nel 1995. Ha partecipato a vari progetti (di manutenzione o di costruzione) e ha lavorato come sviluppatrice Cobol. In seguito ha lavorato come progettista UML e sviluppatore Java. Ultimamente i suoi ruoli principali erano l'analisi e la scrittura dei requisiti funzionali, il coordinamento dei team di business e di sviluppo.