Tenere in vita la sessione [apache wicket][2015][sc]
1. 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 valore
troppo alto consuma risorse inutilmente anche quando l'utente cambia pagina o
chiude il browser, mentre
un 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 eseguono
alcuna 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 nulla
3] 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 programmaticamente
tramite 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;
2. /**
* 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
3. * @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);