Vad är en session och vad innehåller den

Sessionen på servern håller indatastrukturerna för boendekalkylen som kan bestå av flera hundra belopp. I sessionen finns också användargränssnittets sk kontrollträd så att detta inte behöver genereras vid varje anrop.

Dvs öppnas ett "fönster" med tre inmatningsfält så ökas sessionen med information om just detta fönster och de tre inmatningsfälten, informationen om elementen är tex elementens unika ID och inmatningsfältens innehåll mm. Varje element håller också reda på vilka element som finns "inne" i detta element, dvs gränssnittet är uppbyggt som en trädstruktur. Det finns också element som man inte så tydligt tänker på när man tittar på applikationen, sådana element kan vara icke synliga element som "ramar/divvar" och inmatningsverifiering. När fönstret stängs så försvinner det från sessionen. Varje "element" i sessionen kräver mellan 50 bytes och 1kb beroende på element och dess innehåll. Finns det 300 element aktiva för tillfället så kan alltså sessionen vara runt 200kb.

För mer information om denna typ av systemarkitektur så kan vi rekommendera att läsa på om liknande tekniker som tex Java Server Faces och ASP.NET. Dessa systemarkitekturer skiljer sig alltså från system som inte har konceptet med komponentuppbyggt användargränssnitt. Minnesanvändningen kan därmed inte jämföras mellan ett komponentuppbygt system med ett icke komponentuppbyggt system.

Det komponentuppbyggda systemet tillför framförallt minskade underhållskonstnader för webblösningar med många fönster och inmatningsfält eftersom koden kan struktureras bättre samt möjlighet till mindre cpu-användning men använder mer minne.

Har man inga praktiska erfarenheter av komplexa användargränssnitt byggda med komponentuppbyggda system som tex JSF eller ASP.NET så kan man ev bli lite överraskad av den högre minnesanvändningen i dessa system. Mer minne är å andra sidan betydligt mer kostnadseffektivt än cpu och extra tidsåtgång för att underhålla programkod.

När försvinner en session? 

En session försvinner från servern om användaren inte utfört någon handling i gränssnittet som medför ett anrop till servern under 30 minuter. Normalt sett krävs det att användaren klickar på en knapp i applikationen för att ett anrop ska ske till servern. Det räcker alltså inte med att man matar in siffror i fält, vid inmatning av siffror i ett fält sker normalt sett inte något anrop till servern.

Om användaren stängt ner webbläsaren så kommer det att dröja 30 minuter innan sessionen på servern försvinner. Har användaren stängt ner webbläsaren kan användaren normalt sett inte återfå sin session genom att starta boendekalkylen igen, när boendekalkylen startas igen i detta fall så får användaren en ny session mot servern. Detta kan dock fungera på ett annat sätt beroend på hur boendekalkylen är integrerad i annat system.

Vad händer när sessionen på servern försvinner? 

Defaulthanteringen är att klienten inte känner till när sessionen på servern försvinner, vad som händer i applikationen, när session saknas på servern, om användaren klickar på en knapp eller liknande är inte definerat men oftast kommer det upp ett meddelande om att ett sytemfel inträffat, men ibland kan det se ut som om applikationer är ok men att vissa uppgifter man jobbar med försvunnit. Hur länge sessionen varar styr man i konfigurationen av applikationsservern, normalt sett är detta 30 minuter för boendekalkylen, men det kan variera beroende på hur servern är konfigurerad.

Att aktivt döda sessionen programmatiskt

Genom att skicka med inparametern CX.killsession=1 så dödar man den aktuella sessionen. Har man flera system som hänger ihop med en enda inloggning/session så har man troligtvis också en delad utloggningsfunktion, denna delade utloggningsfunktion ska då anropa boendekalkylen med CX.killsession=1 om det är möjligt.

Användargränssnitt för att aktivt logga ut/döda sessionen

Sätt konfigurationen capitex_boendekalkyl_meny_visaavsluta till true för att visa menyvalet avsluta. Denna bör aktiveras när boendekalkylen körs standalone i en högbelastad miljö om det inte någon annan metod används för att avsluta aktuell session på servern. En annan metod kan tex vara att det anropande systemet har en utloggningsfunktion och att den vid utloggning även gör ett anrop till BoKalkGraenssnitt?CX.killsession=1

Att göra klienten "medveten" om serversessionen 

Det finns funktioner som kan aktiveras i Boendekalkylen för att komma tillrätta med problemen som kan uppstå när sessionen försvinner från servern.

Den första inställningen som behöver sättas för att klienten/webbläsaren ska bli "medveten" om när sessionen försvinner är capitex_boendekalkyl_guitimeout_tid. Denna sätts i minuter och ska sättas till några minuter mindre än vad serverns timeout är satt till. Är tex serverns tiumeout satt till 30 minuter så kan det vara lämpligt med följande inställning:

<capitex_boendekalkyl_guitimeout_tid>29</capitex_boendekalkyl_guitimeout_tid>

Dvs klient-timeout'en sker i detta fall efter 29 minuter, medans server-timeout'en sker efter 30 minuter. Klient-timeout'en ska alltid sättas till minst en minut mindre än server-timeout'en för att allt ska fungera korrekt.

Rent tekniskt så fungerar det så här:

  • När ett svar från servern tagits emot av webbläsaren så startar en javascript-timeout, vilket betyder att webbläsaren räknar ner tiden från tex 25 minuter, när denna räknare nått 0 så utförs något i klienten, tex så kan ett meddelande visas.  

  • Om ett nytt anrop görs till servern innan timeout'en inträffat så återställs timeouten.

Funktioner för klienttimeout 
Vad som ska ske när det inträffar en "klient-timeout" styrs av inställningen capitex_boendekalkyl_guitimeout_funktion. Den kan sättas till något av följande:

Meddelande 

<capitex_boendekalkyl_guitimeout_funktion>meddelande</capitex_boendekalkyl_guitimeout_funktion>

Om inställningen ovan används så kommer javascript-funktionen timeoutmessage() att anropas när tiden gått ut. Standardbeteende är då att hela gränssnittet försvinner i klienten och ersätts av texten "Du har varit inaktiv för länge. Boendekalkylen har avslutats". Om eget meddelande önskas eller annan hantering så kan man på sidan där boendekalkylen integrerats lägga en egen javascript-funktion som heter timeoutmessage(), läggs denna sist i html-koden "nedanför" boendekalkylen så kommer denna funktion att anropas istället för standardfunktionen.

Ping (rekommenderas starkt) 

<capitex_boendekalkyl_guitimeout_funktion>ping</capitex_boendekalkyl_guitimeout_funktion>

Om inställningen ovan används så kommer ett litet anrop ske till servern när tiden gått ut, genom att detta anrop görs till servern så kommer sessionen att valideras och därmed existera i 30 minuter till. På detta sätt kommer aldrig sessionen att försvinna från servern så länge som applikationens gränssnitt är öppet i webbläsaren. Använder man denna inställning så kan man med fördel ställa ner sessionstimeout'en på servern till tex 10 minuter och sätta klienttimeout'en till tex 9 minuter. På detta sätt så kommer sessionen på servern att snabbt försvinna per automatik när webbläsaren stängs ner. Sätter man timeout'en för låg så riskerar man dock få onödigt hög trafik till servern. Antag tex att vi har 1000 användare som har kalkylen igång och att klient-timeout'en sätts till 2 minuter, detta medför alltså 500 anrop per minut, dvs ca 8 anrop per sekund enbart i timeoutanrop och det är ju en onödig belastning på servern.

Att tänka på

Serverns session kan tänkas att försvinna av andra anledningar än timeout, dvs tidigare än timeouten. Tex en krash eller omstart av server eller felaktigt konfigurerad lastdelning kan leda till att servern tappar sessionen. Detta blir man alltså inte skyddad av genom ovanstående inställningar utan beteendet i klienten är för detta fall odefinerat om standardinställningarna används. Vill man att användaren ska få ett meddelande om detta händer så kan man skriva in följande i konfigurationen:

<Impcapitex_integration_ISessionskontroll>capitex.boendekalkyl.datalager.KontrolleraBkSession</Impcapitex_integration_ISessionskontroll>
<capitex_boendekalkyl_guitimeout_tid>1</capitex_boendekalkyl_guitimeout_tid>
<capitex_boendekalkyl_guitimeout_funktion>ping</capitex_boendekalkyl_guitimeout_funktion>

Varje gång det blir ett återanrop/postback till servern kommer då sessionen att kontrolleras. Vad som ska kontrolleras kan man skriva egen kod för som ett plugin, här är exempel på den koden som följer med och körs om man skriver enligt ovanstående. Denna funktion finns från och med version 2010.11.