SlideShare una empresa de Scribd logo
1 de 4
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;
/**
* 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
* @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);
add(scriptKA);
--------------------------------------------------------------------------------
--------------------------------------
________________________________________________________________________________
_________________________________________

Más contenido relacionado

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

Anteprima con flash viewer [by sc]
Anteprima con flash viewer [by sc]Anteprima con flash viewer [by sc]
Anteprima con flash viewer [by sc]
santi caltabiano
 
Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2
Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2
Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2
caioturtle
 

Similar a Tenere in vita la sessione [apache wicket][2015][sc] (11)

Stanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al PrgressiveStanco delle solite Web App? Passa al Prgressive
Stanco delle solite Web App? Passa al Prgressive
 
Anteprima con flash viewer [by sc]
Anteprima con flash viewer [by sc]Anteprima con flash viewer [by sc]
Anteprima con flash viewer [by sc]
 
Jasper report anteprima con flash viewer [bysc]
Jasper report   anteprima con flash viewer [bysc]Jasper report   anteprima con flash viewer [bysc]
Jasper report anteprima con flash viewer [bysc]
 
Back to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioBack to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizio
 
ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimization
 
Hadoop analyzerJR
Hadoop analyzerJRHadoop analyzerJR
Hadoop analyzerJR
 
Working between the clouds (versione completa)
Working between the clouds (versione completa)Working between the clouds (versione completa)
Working between the clouds (versione completa)
 
Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2
Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2
Guida al computer - Lezione 98 - Pannello di Controllo – Account Utente Parte 2
 
Javaday 2009 php e java
Javaday 2009 php e javaJavaday 2009 php e java
Javaday 2009 php e java
 
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance TuningWebinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 

Más de santi caltabiano

Más de santi caltabiano (20)

Esercizio semicirconferenze tangenti [sc]
Esercizio   semicirconferenze tangenti [sc]Esercizio   semicirconferenze tangenti [sc]
Esercizio semicirconferenze tangenti [sc]
 
Area di un segmento parabolico
Area di un segmento parabolicoArea di un segmento parabolico
Area di un segmento parabolico
 
L'equilibrio nei fluidi (parte03) [prof. santi caltabiano]
L'equilibrio nei fluidi (parte03) [prof. santi caltabiano]L'equilibrio nei fluidi (parte03) [prof. santi caltabiano]
L'equilibrio nei fluidi (parte03) [prof. santi caltabiano]
 
L'equilibrio nei fluidi (parte02) [prof. santi caltabiano]
L'equilibrio nei fluidi (parte02) [prof. santi caltabiano]L'equilibrio nei fluidi (parte02) [prof. santi caltabiano]
L'equilibrio nei fluidi (parte02) [prof. santi caltabiano]
 
L'equilibrio nei fluidi (parte01) [prof. santi caltabiano]
L'equilibrio nei fluidi (parte01) [prof. santi caltabiano]L'equilibrio nei fluidi (parte01) [prof. santi caltabiano]
L'equilibrio nei fluidi (parte01) [prof. santi caltabiano]
 
Legge di gravitazione universale [prof. santi caltabiano]
Legge di gravitazione universale [prof. santi caltabiano]Legge di gravitazione universale [prof. santi caltabiano]
Legge di gravitazione universale [prof. santi caltabiano]
 
Le tre leggi di keplero [prof. santi caltabiano]
Le tre leggi di keplero [prof. santi caltabiano]Le tre leggi di keplero [prof. santi caltabiano]
Le tre leggi di keplero [prof. santi caltabiano]
 
Caduta di un corpo [prof. santi caltabiano]
Caduta di un corpo [prof. santi caltabiano]Caduta di un corpo [prof. santi caltabiano]
Caduta di un corpo [prof. santi caltabiano]
 
Applicazione dei principi della dinamica [prof. santi caltabiano]
Applicazione dei principi  della dinamica [prof. santi caltabiano]Applicazione dei principi  della dinamica [prof. santi caltabiano]
Applicazione dei principi della dinamica [prof. santi caltabiano]
 
Principi della dinamica [prof. santi caltabiano]
Principi della dinamica [prof. santi caltabiano]Principi della dinamica [prof. santi caltabiano]
Principi della dinamica [prof. santi caltabiano]
 
Le leve [prof. santi caltabiano]
Le leve [prof. santi caltabiano]Le leve [prof. santi caltabiano]
Le leve [prof. santi caltabiano]
 
Coppie di forze [prof. santi caltabiano]
Coppie di forze [prof. santi caltabiano]Coppie di forze [prof. santi caltabiano]
Coppie di forze [prof. santi caltabiano]
 
Momento di una forza [prof. santi caltabiano]
Momento di una forza [prof. santi caltabiano]Momento di una forza [prof. santi caltabiano]
Momento di una forza [prof. santi caltabiano]
 
Equilibrio sul piano inclinato [s. caltabiano]
Equilibrio sul piano inclinato [s. caltabiano]Equilibrio sul piano inclinato [s. caltabiano]
Equilibrio sul piano inclinato [s. caltabiano]
 
La piramide di numeri (prof. s. caltabiano)
La piramide di numeri (prof. s. caltabiano) La piramide di numeri (prof. s. caltabiano)
La piramide di numeri (prof. s. caltabiano)
 
20 dinamica forze d'attrito
20 dinamica   forze d'attrito20 dinamica   forze d'attrito
20 dinamica forze d'attrito
 
10 dinamica concetto di forza
10 dinamica   concetto di forza10 dinamica   concetto di forza
10 dinamica concetto di forza
 
Vettori
VettoriVettori
Vettori
 
00130 cinematica moto rettilineo e velocita media
00130 cinematica   moto rettilineo e velocita media00130 cinematica   moto rettilineo e velocita media
00130 cinematica moto rettilineo e velocita media
 
50 cinematica moto rettilineo uniformemente accelerato
50 cinematica   moto rettilineo uniformemente accelerato50 cinematica   moto rettilineo uniformemente accelerato
50 cinematica moto rettilineo uniformemente accelerato
 

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