JSP: Comment vérifier si un utilisateur est connecté?

J’apprends Java Web, mais j’ai quelques problèmes et j’ai besoin d’aide. J’utilise un fichier template.jsp dans lequel j’inclus les fichiers header.jsp, footer.jsp, login.jsp (le côté gauche du modèle) et ${param.content}.jsp . Pour chaque page nommée X.jsp, j’ai créé un autre jsp avec le contenu suivant, car je souhaite que chaque page ait la même présentation:

   `enter code here`  

Lorsque je clique sur le lien Review, par exemple, je veux être redirigé vers Review.jsp, mais j’ai quelques problèmes. Dans footer.jsp, j’ai quelque chose comme ça:

 (...)  Review  (...) 

Après la connexion, j’essaie de cliquer sur Review, il m’envoie à Review.jsp, mais il me montre que je ne suis pas connecté. J’utilise Spring Framework, Tomcat 7, Eclipse, MySQL. Lorsque je me connecte, je crée un cookie:

 Ssortingng timestamp = new Date().toSsortingng(); Ssortingng sessionId = DigestUtils.md5Hex(timestamp); db.addSession(sessionId, username, timestamp); Cookie sid = new Cookie("sid", sessionId); response.addCookie(sid); 

Pour chaque méthode, j’ai quelque chose comme ceci (je l’ai vu dans un tutoriel):

 @RequestMapping(value = "/writeReview", method = RequestMethod.GET) public Ssortingng nameMethod(@CookieValue("sid") Ssortingng sid,...) 

En utilisant le sid, je peux savoir qui est l’utilisateur. J’ai une firebase database avec le compte de l’utilisateur et quelques autres tables. Le problème est que lorsque je clique sur review ou sur une autre, cela me montre que je ne suis pas connecté. Que puis-je faire?

MISE À JOUR :
J’utilise JavaBean pour l’utilisateur et login.jsp. Le JSP qui a la zone de texte pour la connexion, j’ai une méthode GET lorsque je clique sur le bouton pour me connecter.

 @RequestMapping(value = "/login", method = RequestMethod.GET) public ModelAndView createCookie( @RequestParam("username") Ssortingng username, @RequestParam("password") Ssortingng password, HttpServletRequest request, HttpServletResponse response) throws SQLException { //code for creating the cookie here, after testing if the user is in my database } 

Pour chaque page, j’envoie le sid et j’ai un atsortingbut pour le modèle, nom d’utilisateur:

 public Ssortingng methodName(@CookieValue(required = false) Ssortingng sid, Model model) { if (sid != null) { User user = getUserBySid(sid); model.addAtsortingbute("user", user); } (..other data.) return "nameJSP.jsp"; } 

Je vérifie dans chaque fichier JSP si le nom d’utilisateur n’est pas vide. C’est ainsi que je vois si un utilisateur est connecté. L’application se passe bien, elle transmet les parameters si je ne clique pas sur les liens de l’en-tête ou du pied de page. Le problème est que je dois passer, disons, un paramètre d’un JSP qui est le contenu réel de la présentation à celui qui est référencé par le pied de page. Ce JSP sera le contenu suivant de ma mise en page. La mise en page reconnaît uniquement le contenu et le titre:

 ${param.title} (I didn't paste all the code, I use a table ....)    

Alors, comment puis-je inclure un paramètre dans cette JSP qui sera reçu d’une autre JSP? En outre, il devra être accédé par layout.jsp et envoyé au pied de page ou à l’en-tête?

     

Pour transmettre un ou plusieurs parameters au JSP inclus:

    ....  

Vous le faites déjà.

OK, les détails de la question ne sont pas très clairs, mais je comprends l’idée.
Une des solutions pourrait être la suivante.

Dans votre action de connexion , si l’authentification a réussi, créez HttpSession et définissez un atsortingbut pour l’ utilisateur authentifié:

 if (/* authentication was successfull */) { request.getSession().setAtsortingbute("loggedInUser", user); ... } 

Et dans le code où vous contrôlez si l’utilisateur est connecté, vérifiez simplement la présence de l’atsortingbut HttpSession approprié:

 HttpSession session = request.getSession(false); if (session == null || session.getAtsortingbute("loggedInUser") == null) { // user is not logged in, do something about it } else { // user IS logged in, do something: set model or do whatever you need } 

Ou, dans votre page JSP, vous pouvez vérifier si l’utilisateur est connecté à l’aide des balises JSTL, comme indiqué par BalusC dans l’exemple ci- dessous :

 ...  

You're still logged in.

You're not logged in!

...

Des filtres à la rescousse

Mais généralement, vous vérifiez si l’utilisateur est connecté pour restreindre l’access à certaines pages (ainsi, seul l’utilisateur authentifié peut y accéder). Et vous écrivez une classe qui implémente javax.servlet.Filter .

Voici un exemple de LoginFilter de l’un de mes projets:

 package com.example.webapp.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * The purpose of this filter is to prevent users who are not logged in * from accessing confidential website areas. */ public class LoginFilter implements Filter { /** * @see Filter#init(FilterConfig) */ @Override public void init(FilterConfig filterConfig) throws ServletException {} /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); if (session == null || session.getAtsortingbute("loggedInUser") == null) { response.sendRedirect(request.getContextPath() + "/login.jsp"); } else { chain.doFilter(request, response); } } /** * @see Filter#destroy() */ @Override public void destroy() {} } 

Dans ce projet, j’ai utilisé des servlets simples et JSP sans Spring, mais vous aurez l’idée.

Et bien sûr, vous devez configurer web.xml pour utiliser ce filtre:

   ...  Login Filter com.example.webapp.filter.LoginFilter   Login Filter /*  ...  

Note :
Si vous utilisez un conteneur Web ou un serveur d’applications prenant en charge Servlet version 3.0 et ultérieure, vous pouvez annoter votre classe de filtre avec l’annotation @WebFilter, auquel cas il n’est pas nécessaire de configurer le filtre dans le descripteur de déploiement ( web.xml ). Voir un exemple d’utilisation de l’annotation @WebFilter et d’autres informations relatives au filtre ici .

J’espère que ceci vous aidera.

Ou simplement utiliser:

 Ssortingng username = request.getRemoteUser();