2009-12-13 4 views
0

Je suis nouveau pour les servlets et jsps. Je voulais savoir quel serait le meilleur design pour un exemple de problème pour lequel j'essaye d'écrire du code. Je veux créer un site Web (www.example.com) qui ne fait que répertorier l'historique de connexion de chaque utilisateur (pas n'importe quelle fonctionnalité que l'on veut mais juste un exemple pour le plaisir d'un). Il y a donc deux URL ici - /index.jsp et/login (Supposons que tous les enregistrements sont terminés).Question de conception - servlets, jsps, balises personnalisées, html

L'index.jsp affichera toutes les connexions passées pour cet utilisateur. Mais pour cela, je dois identifier si l'utilisateur est déjà connecté ou non. Si l'utilisateur est déjà connecté, je lui montre son historique, sinon je dois le rediriger automatiquement vers la page de connexion.

J'ai déjà écrit un cookie cryptographiquement fort personnalisé qui me dira si l'utilisateur est connecté ou non. Donc, si le cookie est envoyé à moi, je peux vérifier s'il est authentifié ou si le cookie/session a expiré ou non. Ce n'est pas un problème.

Le problème de conception que j'ai est le suivant - Comment appeler la vérification de classe java pour l'authentification? Est-ce que j'utilise des balises jsp personnalisées pour vérifier cela et réécrire la page? Je veux que la classe soit facile à utiliser pour mes développeurs html lors de la création de nouvelles pages. Quelle est la meilleure façon de procéder?

Je suppose que ma question a plus à voir avec l'utilisation correcte du code java dans jsps et/ou peut-être des bibliothèques de balises personnalisées. N'hésitez pas à continuer aussi longtemps que vous le souhaitez :)

Merci d'avoir lu.

  • Vas

Répondre

2

Vous pouvez utiliser un Filter pour cela. De cette façon, vous pouvez garder la logique du code à un seul endroit sans avoir besoin de copypasser inutilement le même code sur toutes les pages JSP et cela garde également bien JSP scriptlet -free. Au lieu de réinventer la session en créant un cookie vous-même, vous pouvez utiliser l'API HttpSession Java EE fournie. Ceci est essentiellement déjà soutenu par un cookie et vous pouvez stocker des objets Java dans la session en tant qu'attributs afin qu'ils restent disponibles toute la session de l'utilisateur.

Sur connexion vient de mettre l'objet dans UserHttpSession:

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

Pour vérifier si un utilisateur est connecté, utilisez un Filter. Mettre en œuvre la méthode doFilter() comme suit:

if (((HttpServletRequest) request).getSession().getAttribute("user") != null) { 
    chain.doFilter(request, response); // User is logged in, just continue with request. 
} else { 
    ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page. 
} 

et la carte sur un url-pattern comme /secured, /restricted, /users environ. Placez également les pages JSP à restreindre dans le même dossier de webcontent.

Pour vous déconnecter un utilisateur, supprimez-le de la session:

request.getSession().removeAttribute("user"); 

// Or, more drastically, invalidate the entire session: 
request.getSession().invalidate(); 

Cela dit, Java EE fournit déjà conteneur déclarative (base xml-config) géré la sécurité, vous pouvez trouver un tutoriel à ce sujet here. Vous pouvez l'utiliser, mais si vous voulez laisser votre application intercepter de manière indépendante sur les connexions gérées par le conteneur pour par exemple garder un aperçu de l'historique de connexion, alors vous devez toujours créer un Filter. Par exemple:

HttpServletRequest httpRequest = (HttpServletRequest) request; 
UserPrincipal user = httpRequest.getUserPrincipal(); 
HttpSession session = httpRequest.getSession(); 
if (user != null && session.getAttribute("user") == null) { 
    session.setAttribute("user", user); 

    // First-time login. You can do your intercepting thing here. 
} 
chain.doFilter(request, response); 
+0

Merci. Je ne connaissais pas les filtres jusqu'à maintenant. Je les ai regardés brièvement. Ils ressemblent à ce dont j'ai besoin. Ai-je raison de dire que les filtres devraient être utilisés pour déterminer la logique dans les JSP et les balises personnalisées pour les choses liées à l'interface utilisateur comme l'obtention du nom d'utilisateur, de l'emplacement, etc. – user220201

+0

Le 1er lien de ma réponse contient les informations que vous devez savoir sur les filtres. Ils sont destinés à, bien, ** filtrer ** les demandes. JSP est juste une technologie de visualisation et devrait aussi être utilisée pour: ** présenter ** les données de manière dynamique. Les balises JSP personnalisées ne sont généralement utiles que pour remplacer des éléments HTML répétés, tels que '