Tenere in vita la sessione [apache wicket][2015][sc]

4

Click here to load reader

Transcript of Tenere in vita la sessione [apache wicket][2015][sc]

Page 1: Tenere in vita la sessione [apache wicket][2015][sc]

TENERE IN VITA LA SESSIONE IN WICKET (KEEP ALIVE SESSION)

La durata, in minuti, della sessione può essere assegnata mediante il descrittore web.xml. Un valoretroppo alto consuma risorse inutilmente anche quando l'utente cambia pagina o chiude il browser, mentreun valore troppo basso porta ad avere facilmente timeout di sessione (sgradevole per l'utente finale).

La soluzione ottimale è quella di assegnare un valore basso e mantenere in vita la sessione con dei ping.Ad esempio si può assegnare un timeout di 2 min e fare delle chiamate ajax "fantasma" (cioè che non eseguonoalcuna attività) al server ogni 1,5 min.

La prima idea è di aggiungere alla pagina (da cui ereditano le altre, oppure creare un pannello ad hoc, ...)un AbstractAjaxTimerBehavior con un timer di 90 sec. Questo non farà scadere la sessione. Tuttavia, ho constatato personalmente, durante l'esecuzione di operazioni "lunghe" lato server (ad esempio il lancio di un report con migliaia di record) l'istanza di AbstractAjaxTimerBehavior smette di funzionare.Di conseguenza nel frattempo la sessione spuò scadere.

L'alternativa che ho trovato consisten nel:1] Assegnare un timeout di sessione di 2min (file web.xml)2] Creare una servlet KeepAliveSession che non fa nulla e non restituisce nulla3] Aggiungere alla pagina (o pannello ad hoc) uno script che ogni 90 secondi esegue una chiamata ajax alla servlet KeepAliveSession. <script type="text/javascript"> window.setInterval("jQuery.ajax({url:'/MiaApplicazione/KeepAliveSession'})", 90000); </script>

Ecco i passi indettaglio,

_________________________________________________________________________________________________________________________PASSO 1]

Assegnazione del session timeout tramite il file web.xml (in minuti). Si ricorda che può anche essere assegnato programmaticamentetramite l'oggetto Session.

<session-timeout>2</session-timeout>

_________________________________________________________________________________________________________________________PASSO 2] Creazione della Servlet KeepAliveSession

----------------------------------------------------------------------------------------------------------------------package com.osanet.servlets;

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

Page 2: Tenere in vita la sessione [apache wicket][2015][sc]

/** * Servlet utilizzata per tenere in vita la sessione * @author Santi Caltabiano */public class KeepAliveSession extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession(false); // Non restituisce nulla response.setStatus(HttpServletResponse.SC_NO_CONTENT); }

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }

@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }

}----------------------------------------------------------------------------------------------------------------------

_________________________________________________________________________________________________________________________PASSO 3] Aggiungere il codice alla pagina (o al pannello ad hoc) per la chiamata ajax ogni 90 secondi della servlet.

Un primo metodo può essere quello di scrivere di scrivere un behavior che aggiunge la chiamata nell'hedear della pagina, il cui codice è riportato di seguito.

----------------------------------------------------------------------------------------------------------------------package com.osanet.components.behavior;

import com.osanet.application.Application;import org.apache.wicket.Component;import org.apache.wicket.behavior.AbstractAjaxBehavior;import org.apache.wicket.markup.head.IHeaderResponse;import org.apache.wicket.markup.head.OnDomReadyHeaderItem;

/** * Aggiunge all'header la chiamata ripetuta (setInterval) alla servlet KeepAliveSession * che tiene in vita la sessione * @author Santi Caltabiano */public class KeepAliveSessionBehavior extends AbstractAjaxBehavior{ private long seconds=0;

/** * La chiamata viene eseguita ogni seconds

Page 3: Tenere in vita la sessione [apache wicket][2015][sc]

* @param seconds */ public KeepAliveSessionBehavior(long seconds) { this.seconds=seconds; }

@Override public void renderHead(Component component, IHeaderResponse response) { // Recupera contextName Application application=(Application) Application.get(); String contextName=application.getServletContext().getServletContextName(); // Costruisce url per la servlet KeepAliveSession String url="/"+contextName+"/KeepAliveSession"; // Aggiunge il setInterval per la chiamata ajax della servlet response.render(OnDomReadyHeaderItem.forScript("window.setInterval(\"jQuery.ajax({url:'"+url+"'})\", "+getSeconds()*1000 +");")); }

public void onRequest() { }

/** * @return the seconds */ public long getSeconds() { return seconds; } }

----------------------------------------------------------------------------------------------------------------------

Successivamente aggiungere alla pagina il behavior:

----------------------------------------------------------------------------------------------------------------------KeepAliveSessionBehavior behavior=new KeepAliveSessionBehavior(90)add(behavior)----------------------------------------------------------------------------------------------------------------------

ALTERNATIVAMENTE si può utilizzare uno stratagemma meno elegante ma ugualmente efficace.

Si aggiunge all'header della pagina html:

----------------------------------------------------------------------------------------------------------------------<script wicket:id="scriptKA"></script>----------------------------------------------------------------------------------------------------------------------

Si aggiunge il codice:

----------------------------------------------------------------------------------------------------------------------String url="window.setInterval(\"jQuery.ajax({url:'/MiaApplicazione/KeepAliveSession'})\", 90000);";Label scriptKA=new Label("scriptKA",url);

Page 4: Tenere in vita la sessione [apache wicket][2015][sc]

add(scriptKA);----------------------------------------------------------------------------------------------------------------------

_________________________________________________________________________________________________________________________