Taille d'une session

0/5 (4 avis)

Snippet vu 11 607 fois - Téléchargée 31 fois

Contenu du snippet

Donne la taille d'une session, ceci est à utiliser dans le cas de debugage ou de problèmes connexes avec les sessions J2EE.

Source / Exemple :


<%@ page contentType = "text/html;" 
import="java.sql.* , java.util.*, java.util.Date, java.io.*, java.net.*, java.lang.*" %>

<%
if(request.getParameter("purge_session") != null){
	session.invalidate();
	request.getSession(true);
}
%>

<%!
public static int computeObjectSize(Object o){
	ByteArrayOutputStream baOS;
	ObjectOutputStream objOS;
	int size=0;
	try {
		baOS = new ByteArrayOutputStream();
		objOS = new ObjectOutputStream(baOS);
		objOS.writeObject(o);
		baOS.close();
		objOS.close();
		size = baOS.size();		
	} catch (IOException e) {
	} finally{
		baOS=null;
		objOS=null;
	}
	return size;
}

%>

<html>
<head>
<link href="cewolf.css" rel="stylesheet" type="text/css">
<script language="JavaScript" type="text/javascript">
function verif(){
	if(confirm('Voulez invalidée la session ?')){
		document.form[0].submit();	
	}
}
</script>

</head>
<BODY bgcolor="#DDE8F2">
<H1>Session content</H1>
<p>
<table border=1>
<TR>
<td>
Variable de Session
</td>
<td align="center">
Valeurs
</td>
<td width="30">
Size
</td>
</tr>
<%
System.gc();
float taille=0;
Enumeration names = session.getAttributeNames();
while(names.hasMoreElements()){
  String name = (String)names.nextElement();
  
%>
<TR>
<TD>
<% out.write(name); %>
</TD>
<TD>
<% out.println(session.getAttribute(name)); %>
</TD>
<TD>
<%
	taille=taille+computeObjectSize(name);
	if(computeObjectSize(name)>1024){
		out.println(computeObjectSize(name)/1024+" ko");
	}
	else {
		out.println(computeObjectSize(name)+" o");
	}
%>
</TD>
</TR>
<%
}
%>
</TABLE>

<table>
<tr>
	<td>Taille du cache :</td>
	<td><%
	if(taille>1024){
	 out.println(taille/1024+" ko");
	}
	else
	{
	 out.println(taille+" o");
	}
	 %> </td>
</tr>
</table>

<FORM>
<INPUT TYPE="submit" VALUE="Reload">
<INPUT TYPE="button" onclick="verif()" VALUE="Purge Session" NAME="purge_session">
</FORM>

 
</body>
</html>

A voir également

Ajouter un commentaire Commentaires
hebenky
Messages postés
3
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
13 novembre 2006

13 nov. 2006 à 10:05
Cette question n'a à priori rien a faire ici.
Sinon pour faire simple : tu ajoutes dans la session un Integer que tu incrémentes à chaques appel de méthode service() de la servlet.

exemple :
service (request, response){
// attention au return null de getSession
Integer nbPageVisited = request.getSession().getAttribut("nbPageVisited");


if (nbPageVisited != null){
request.getSession().setAttribut("nbPageVisited", new Integer(nbPageVisited.intValue() + 1));
}
else {
request.getSession().setAttribut("nbPageVisited", new Integer(1));

}

}

voila, si tu as besoin de faire cela sur plusieurs servlets, il te suffit d'en faire une générique (qui implémentera la méthode précédente) et de de faire en sorte que les autres en héritent.
mangoo8
Messages postés
3
Date d'inscription
dimanche 12 novembre 2006
Statut
Membre
Dernière intervention
26 mars 2008

12 nov. 2006 à 20:03
j'arrive pas a résoudre une servlet qui permet d'afficher le nombre de visites d'une page pendant une session de navigation
hebenky
Messages postés
3
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
13 novembre 2006

9 oct. 2006 à 14:41
Bonjours à tous,
deux commentaires :

- Effectivement Jérôme, la fonction computeObjectSize appelée comme dans le scriptlet initiale calcul la taille des identifiants. La correction que tu proposes est correcte.

- Le fait que cette fonction ne détermine la taille des objets que ssi ils sont sérialisables n'est pas une aberration. Bien au contraire, j'irais plus loin et je dirais que si je tombe sur un objet non sérialisable alors j'indique au développeur une erreur. Cette petite "astuce" permet d'assurer une compatibilité de l'application web sur des systèmes de clustering qui souvent réclament que le contenu d'une session soit sérialisable pour être partageable.


NB : un objet qui implémente java.io.Serializable n'est pas forcément sérialisable (il faut aussi que l'ensemble des ses propriétées soit sérialisables) . Pour savoir si l'objet est sérialisable, la méthode la plus simple est de sérialiser l'objet et de trapper l'exception java.io.NotSerializableException.


public static int computeObjectSize(Object o){
ByteArrayOutputStream baOS;
ObjectOutputStream objOS;
int size=0;
try {
baOS = new ByteArrayOutputStream();
objOS = new ObjectOutputStream(baOS);
objOS.writeObject(o);
baOS.close();
objOS.close();
size = baOS.size();
}
catch (IOException e) {
} finally{
baOS=null;
objOS=null;
}
return size;
}


Bon courage
ben
jmanson
Messages postés
2
Date d'inscription
vendredi 9 juin 2006
Statut
Membre
Dernière intervention
12 juin 2006

12 juin 2006 à 12:04
Salut !

J'ai une remarque : je ne suis pas sûr que tu prennes en compte tous les objets de la session !
ta variable "names" contient la liste des identifiants des objets en session.
ensuite tu récupère chaque identifiant dans la variable "name".
"name" est donc une chaine de caractères, envoyée en paramètre à la fonction "computeObjectSize". Tu calcules donc la taille des identifiants !
Me trompe-je ?

perso, j'aurais mis "computeObjectSize(session.getAttribute(name))"
problème : ta fonction computeObjectSize est uniquement OK pour les objets sérialisables. renvoie 0 sinon.

Any comment ?

Jerome

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.