2010-02-21 4 views
2

Je développe une application web en utilisant des servlets et des jsps. J'ai une question sur le stockage des données que je dois utiliser entre plusieurs servlets dans une session de connexion. Lorsque l'utilisateur se connecte, par exemple, j'obtiens l'objet utilisateur de la base de données et je souhaite le stocker quelque part et que les servlets et jsps suivants l'utilisent sans avoir à interroger à nouveau la base de données. Je sais que je dois stocker l'objet dans un tableau global, mais je ne suis pas en mesure de trouver la meilleure façon de le faire.Question de conception - Données persistantes dans une session webapp

Je pense à avoir une hashmap statique ou une autre structure de données créée au moment du chargement de la webapp et je peux l'utiliser pour stocker l'objet utilisateur avec le sessionID comme clé pour le hashmap.

Y a-t-il un meilleur moyen? Toute aide est appréciée.

Merci, - Vas

Répondre

5

Vous n'avez pas besoin de gérer les sessions vous. Le servletcontainer le fera pour vous de manière transparente dans la saveur de HttpSession. Vous utilisez normalement HttpSession#setAttribute() pour stocker un objet dans la portée de session et HttpSession#getAttribute() pour obtenir un objet de la portée de session. Vous pouvez utiliser HttpServletRequest#getSession() pour obtenir une référence au HttpSession.

E.g. dans le servlet de connexion:

User user = userDAO.find(username, password); 
if (user != null) { 
    request.getSession().setAttribute("user", user); 
} else { 
    // Show error? 
} 

Vous pouvez le récupérer plus tard dans une servlet ou un filtre dans la même session par

User user = (User) request.getSession().getAttribute("user"); 
if (user != null) { 
    // User is logged in. 
} else { 
    // User is not logged in! 
} 

Vous pouvez même accéder par EL JSP:

<p>Welcome, ${user.username}! 

(en supposant qu'il existe une méthode Javabean getUsername())

+0

Est-ce que cela fonctionne sur plusieurs servlets? Je l'ai vu ne fonctionnait que d'une servlet à un jsp et non à travers plusieurs servlets. – user220201

+0

Si les servlets sont demandés dans la ** session **, cela fonctionnera. Peut-être que vous le confondez avec 'request.setAttribute()' qui ne fonctionnera en effet que dans la même ** requête **. – BalusC

4

Il y a une façon de le faire et il est défini dans la spécification de servlet. Vous pouvez obtenir l'objet HttpSession et ajouter des objets en tant que "attributs".

Jetez un coup à l'API ici: http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html

+0

Je les ai utilisés mais les attributs que j'ai définis dans une servlet sont visibles dans le jsp auquel la requête est transmise mais pas dans une nouvelle servlet ou est-ce? – user220201

1

Selon vos besoins et votre imp lementation, vous pouvez également considérer les options suivantes:

  • rendre l'objet utilisateur sérialisable et stocker dans la session elle-même;
  • stocke uniquement l'ID utilisateur dans la session et implémente la mise en cache dans votre DAO/référentiel, donc pas de requête de base de données réelle. Dans ce cas, vous devez vous assurer que les modifications ultérieures de l'objet utilisateur sont propagées. sera invoqué s'il n'est pas nécessaire; Si vous utilisez Hibernate ou un autre ORM, vous pouvez avoir cette fonctionnalité hors de la boîte; cela semble le moins invasif car les modifications sur l'objet utilisateur seront synchronisées avec l'état de l'application et la base de données si elle est correctement gérée par la couche de persistance

Il existe probablement beaucoup plus d'options disponibles.

+0

Merci! Je vais vérifier cela. Bien que la deuxième option semble mieux. – user220201

1

Nous construisons un réseau social comme livemocha.com et nous vous recommandons de mettre le minimum possible dans la session.Il suffit de stocker uniquement l'ID utilisateur dans la session, et vous n'avez certainement pas besoin de vous assurer que les modifications ultérieures de l'objet utilisateur sont propagées à l'objet stocké dans la session ou la base de données (en fonction de celui qui changera) . ;-)

Questions connexes