En tant qu'étoile montante, JSP peut occuper une certaine position dans l'environnement de programmation serveur, qui est étroitement liée à sa bonne prise en charge d'une série de normes industrielles. La session est l’une des infrastructures qu’elle fournit. En tant que programmeur, vous pouvez facilement implémenter une gestion simple des utilisateurs basée sur la session sans vous soucier de la manière dont elle est implémentée sur le client. Il existe aujourd’hui différentes manières de traiter avec les utilisateurs en ligne.
La première est que l'actualisation de la page est contrôlée par l'utilisateur et que le serveur contrôle un délai d'attente tel que 30 minutes. Une fois le délai écoulé, l'utilisateur sera expulsé s'il n'y a aucune action. L'avantage de cette méthode est que si l'utilisateur oublie de se déconnecter, elle peut empêcher les autres d'effectuer des opérations malveillantes. L'inconvénient est que si vous faites quelque chose qui prend beaucoup de temps et dépasse ce délai, vous devrez peut-être vous reconnecter lors de la soumission. Si la surface originale de la feuille tombe à nouveau en panne, vous risquez de perdre le travail que vous avez effectué. Du point de vue de l'implémentation, c'est le plus simple, et côté serveur implémente ce mode par défaut.
Une autre façon est que le site adopte une structure de cadre, et il y a un cadre ou un iframe caché qui est constamment actualisé, de sorte que vous ne serez jamais expulsé. Cependant, afin de déterminer si vous êtes en ligne, le serveur doit définir un. Si vous dépassez ce temps de stupéfaction, si vous n'actualisez pas d'autres pages à l'exception de cette page actualisée automatiquement, il sera considéré que vous n'êtes plus en ligne. Un exemple typique de cette approche est xici.net. Son avantage est qu'il peut utiliser l'actualisation continue pour implémenter certaines fonctions de type push serveur, telles que l'envoi de messages entre internautes.
Quel que soit le mode utilisé, un travail supplémentaire doit être effectué afin de parcourir tous les utilisateurs actuellement en ligne. Il n'y a pas d'API pour obtenir la liste des sessions dans l'API Servlet.
Ce qui peut être utilisé, c'est Listener. Les spécifications des Servlets 2.2 et 2.3 sont légèrement différentes ici. HttpSessionBindingListener dans 2.2 peut implémenter une classe qui vous avertit lorsque l'attribut d'une HTTPSession change. HttpSessionAttributeListener a également été introduit dans la version 2.3. Étant donné que l'environnement que j'utilise est Visual Age pour Java 4 et le serveur JRun 3.1, ils ne prennent pas directement en charge la programmation Servlet 2.3. Ici, j'utilise HttpSessionBindingListener
. implémentez l'interface HttpSessionBindingListener. Cette interface a deux méthodes :
public void valueBound (événement HttpSessionBindingEvent)
public void valueUnbound (événement HttpSessionBindingEvent)
Lorsque vous exécutez Session.addAttribute (String, Object), si vous avez ajouté une classe qui implémente l'interface HttpSessionBindingListener en tant qu'attribut, Session vous en informera. votre classe et appelez votre méthode valueBound. Au contraire, la méthode Session.removeAttribute correspond à la méthode valueUndound.
public class HttpSessionBinding implémente javax.servlet.http.HttpSessionBindingListener
{
ServletContext application = null;
public HttpSessionBinding(
ServletContext application)
{
super();
if (application ==null)
throw new IllegalArgumentException("L'application nulle n'est pas acceptée.");
.application = application;
}
public void valueBound(javax.servlet.http.HttpSessionBindingEvent e)
{
Vecteur activeSessions = (Vecteur) application.getAttribute("activeSessions");
if (activeSessions == null)
{
activeSessions = new Vector();
}
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");
if
(sessionUser != null)
{
activeSessions.add(e.getSession())
;
;
}
public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e)
{
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");
if (sessionUser == null)
{
Vector activeSessions = (Vector) application .getAttribute("activeSessions");
if (activeSessions != null)
{
activeSessions.remove(e.getSession().getId());
application.setAttribute
(
"
activeSessions
",activeSessions)
;
La classe est une classe utilisateur arbitraire. Lors de la connexion de l'utilisateur, ajoutez à la fois la classe User et la classe HttpSessionBinding à la session.
De cette façon, chaque fois qu'un utilisateur se connecte, un enregistrement sera ajouté au vecteur d'attribut "activeSessions" dans l'application. Chaque fois que la session expire, valueUnbound est déclenché et la session qui sera expirée est supprimée de ce vecteur.
public void login()
throws ACLException,SQLException,IOException
{
/* get JDBC User Class */
if (user != null )
{
logout ();
}
{
// si la session expire ou si l'utilisateur ne s'est pas connecté, enregistrez temporairement l'URL cible
uf
= new JDBCUserFactory();
=null) || (this.request.getParameter("password")==null) )
{
throw new ACLException("Veuillez saisir un nom d'utilisateur et un mot de passe valides."
}
JDBCUser user = (JDBCUser) uf.UserLogin(
this. .request. getParameter("userID"),
this.request.getParameter("mot de passe") );
user.touchLoginTime();
this.session.setAttribute
("user",user);
,new HttpSessionBinding (application));
}
}
Lors de la connexion, ajoutez l'utilisateur et la classe d'objectif BindingNotofy à la session. Lors de la déconnexion, vous devez supprimer activement la session dans le vecteur activeSessions.
public void logout()
throws SQLException,ACLException
{
if (this.user == null && this.session.getAttribute("user")==null)
{
return ;
}
Vecteur activeSessions = (Vecteur) this.application.getAttribute("activeSessions");
if (activeSessions
!= null)
{
activeSessions.remove
(this.session);
application.setAttribute("activeSessions",activeSessions);
util.Enumeration e = this.session.getAttributeNames();
while (e.hasMoreElements())
{
String s = (String)e.nextElement();
this.session.removeAttribute
(s)
; );
this.user = null;
}
Ces deux fonctions se trouvent dans une classe HttpSessionManager. Cette classe fait référence à l'objet global de l'application dans jsp. L’autre code de cette classe n’a rien à voir avec cet article et est assez long, je ne le publierai donc pas.
Voyons comment l'utiliser dans JSP.
Supposons qu’un formulaire de connexion soit soumis à doLogin.jsp et que le formulaire contienne les champs UserName et password. Extrait :
<%
HttpSessionManagerhsm
= new HttpSessionManager(application,request,response);
try
{
hsm.login
(
)
;
.");
return;
}
catch (InvalidPasswordException e2)
{
réponse.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid%20Password");
return;
}
catch (Exception e3)
{
%> Erreur :<%=e3. toString( ) %><br>
Appuyez sur <a href="login.jsp">Ici
</a> pour vous reconnecter
<% return;
}
réponse.sendRedirect("index.jsp")
;
J'ai maintenant Comment obtenir une liste des utilisateurs actuellement en ligne.
<body bgcolor="#FFFFFF">
<table cellpacing="0" cellpadding="0" width="100%">
<tr >
<td style="width:24px">SessionId
</td>
<td style= "width:80px" >Utilisateur
</td>
<td style="width:80px" >Heure de connexion
</td>
<td style="width:80px" >Heure du dernier accès
</td>
</tr>
<%
Vecteur activeSessions = (Vecteur) application.getAttribute("activeSessions");
if (activeSessions == null)
{
activeSessions = new Vector();
application.setAttribute("activeSessions",activeSessions
}
Itérateur it = activeSessions.iterator())
;;
while (it.hasNext())
{
HttpSession sess = (HttpSession)it.next();
JDBCUser sessionUser = (JDBCUser)sess.getAttribute
("user");
():"Aucun";
%>
<tr>
<td nowrap=''><%= sess.getId() %></td>
<td nowrap=''><%= userId %></td>
<td nowrap=''>
<%= BeaconDate.getInstance( new Java.util.Date(sess.getCreationTime())).getDateTimeString()%></td>
<td class="<%= stl %>3 " nowrap=''>
<%= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%></td>
</tr>
<%
}
%>
</table>
</body>
Le code ci-dessus récupère les activeSessions de l'application et affiche l'heure spécifique. La classe BeaconDate est supposée être une classe temporelle formatée.
De cette façon, nous obtenons un cadre pour visualiser la liste des utilisateurs en ligne. Quant à la pagination de la liste d'utilisateurs en ligne et à d'autres fonctions, elles n'ont aucun rapport avec cet article et ne seront pas abordées.
Il s'agit d'un exemple de modèle sans actualisation qui s'appuie sur le mécanisme d'expiration de session. Mon collègue Sonymusic a souligné que cela peut souvent ne pas être fiable en raison des idées différentes de chaque fabricant. Compte tenu de cette exigence, il est nécessaire de déterminer si le temps écoulé depuis la dernière utilisation par l'utilisateur actuel dépasse une valeur de temps prédéterminée lorsque chaque surface de feuille est rafraîchie. Il s’agit essentiellement d’implémenter vous-même le délai d’attente de session. Si vous devez implémenter un modèle d'actualisation, vous devez utiliser cette méthode d'évaluation de l'actualisation pour chaque surface feuille.