IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Java Session multiple


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Niger

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 41
    Par défaut Java Session multiple
    Bonjour à tous,

    j'ai une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public String seConnecter() {
            User user = adminService.getUser(nummat);
            if (user == null) {
                MessagesJsf.addErrorMessage("Le login n'est pas correct");
                return null;
            }
            if (!password.equals(user.getPassword())) {
                MessagesJsf.addErrorMessage("Le mot de passe n'est pas correct");
                return null;
            }
            this.setUserConnecte(user);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
                    Params.AUTH_KEY, nummat);
            login = null;
            password = null;
            return "home";
        }
    via laquelle un utilisateur se connecte à l'application.
    Le filtre correspondant est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class AuthenticationFilter implements Filter {
     
        private FilterConfig config;
     
        public FilterConfig getConfig() {
            return config;
        }
     
        public void setConfig(FilterConfig config) {
            this.config = config;
        }
     
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
     
            HttpServletRequest request = (HttpServletRequest) req;
            if (request.getSession().getAttribute(Params.AUTH_KEY) == null) {
                ((HttpServletResponse) resp).sendRedirect(request.getContextPath() + "/faces/login.xhtml");
            } else {
                chain.doFilter(req, resp);
            }
        }
     
        @Override
        public void init(FilterConfig config) throws ServletException {
            this.config = config;
        }
     
        @Override
        public void destroy() {
            config = null;
        }
     
    }
    Et ça marche!
    Mon probleme c'est quand un user est déjà connecté, un autre ne peut se connecter. Je m'explique: quand un user1 se connecte et que un user2 veut se connecter à partir d'une autre machine, l'application montre l'accueil avec le user déjà connecté. Et user2 doit deconnecter user1 pour pouvoir se connecter.

    Quelqu'un a-t-il une idée sur comment je dois proceder pour rendre mon appli multi-utilisateurs?

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ben t'évite de stocker des trucs dans l'application scope ou dans des variables static et ça ne devrait pas poser des soucis. Maintenant avec les quelque framents de code que t'as mis on peux pas te dire exactement où est ton erreur, on ne sais pas d'où sortent tes méthodes, comment les beans sont configurés, qu'est-ce qui se passe.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Niger

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 41
    Par défaut
    Bonjour tchize_ et merci d'avoir répondu.

    Voici mes deux classes au complet:
    La classe connexionBean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
     
    import com.talbus.data.admin.User;
    import com.talbus.service.AdminService;
    import com.talbus.util.MessagesJsf;
    import com.talbus.util.Params;
    import java.io.Serializable;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.context.FacesContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
     
    @ManagedBean(name = "connexionBean")
    @SessionScoped
    @Component("connexionBean")
    public class ConnexionView extends TalbusView implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        private String login;
        private String service;
        private String nummat;
        private String password;
     
        @Autowired
        private AdminService adminService;
     
        public String getLogin() {
            return login;
        }
     
        public void setLogin(String login) {
            this.login = login;
        }
     
        public String getService() {
            return service;
        }
     
        public void setService(String service) {
            this.service = service;
        }
     
        public String getNummat() {
            return nummat;
        }
     
        public void setNummat(String nummat) {
            this.nummat = nummat;
        }
     
        public AdminService getAdminService() {
            return adminService;
        }
     
        public void setAdminService(AdminService adminService) {
            this.adminService = adminService;
        }
     
        public String getPassword() {
            return password;
        }
     
        public void setPassword(String password) {
            this.password = password;
        }
     
        public String seConnecter() {
            User user = adminService.getUser(nummat);
            if (user == null) {
                MessagesJsf.addErrorMessage("Le login n'est pas correct");
                return null;
            }
            if (!password.equals(user.getPassword())) {
                MessagesJsf.addErrorMessage("Le mot de passe n'est pas correct");
                return null;
            }
            this.setUserConnecte(user);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
                    Params.AUTH_KEY, nummat);
            login = null;
            password = null;
            return "home";
        }
     
     
     
        public String deconnect() {
            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            HttpSession session = request.getSession();
            session.invalidate();
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove(Params.AUTH_KEY);
            this.setUserConnecte(null);
            return "login";
        }
     
        @Override
        protected void cleanUp() {
     
        }
    }
    et la classe AuthenficationFilter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    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;
     
    public class AuthenticationFilter implements Filter {
     
        private FilterConfig config;
     
        public FilterConfig getConfig() {
            return config;
        }
     
        public void setConfig(FilterConfig config) {
            this.config = config;
        }
     
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
     
            HttpServletRequest request = (HttpServletRequest) req;
            if (request.getSession().getAttribute(Params.AUTH_KEY) == null) {
                ((HttpServletResponse) resp).sendRedirect(request.getContextPath() + "/faces/login.xhtml");
            } else {
                chain.doFilter(req, resp);
            }
        }
     
        @Override
        public void init(FilterConfig config) throws ServletException {
            this.config = config;
        }
     
        @Override
        public void destroy() {
            config = null;
        }
     
    }
    Merci encore

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je ne vois rien que forcerait un partage de session. C'est reproductible ton problème? Faut décrire un peu plus ce qui se passe, parce que là il y a juste un marqueur dans la session, rien de transcendant et aucune raison que ce soit partagé entre deux browsers différents.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Niger

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 41
    Par défaut
    Merci tchize_,

    voilà, je viens de modifier ma servlet mais il n'y a aucun changement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class LoginServlet extends HttpServlet {
     
        private static final long serialVersionUID = 1L;
     
        @Override
        protected void doPost(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
     
            String login = request.getParameter("login");
            String password = request.getParameter("password");
     
            if (!login.isEmpty() && !password.isEmpty()) {
                User currentUser = new User();
                currentUser.setLogin(login);
                currentUser.setPassword(password);
     
                request.getSession().setAttribute("user", currentUser);
                request.getRequestDispatcher("accueil.xhtml").forward(request, response);
     
            } else {
                response.sendRedirect("login.xhtml");
            }
     
        }
     
    }
    mon web.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <servlet>
            <servlet-name>AuthentificationView</servlet-name>
            <servlet-class>com.util.LoginServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>AuthentificationView</servlet-name>
            <url-pattern>/AuthentificationView</url-pattern>
        </servlet-mapping>
    et mon bean de connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    @ManagedBean(name = "connexionBean")
    @SessionScoped
    @Component("connexionBean")
    public class ConnexionView extends TalbusView implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        private String login;
        private String service;
        private String nummat;
        private String password;
     
        @Autowired
        private AdminService adminService;
     
        public String getLogin() {
            return login;
        }
     
        public void setLogin(String login) {
            this.login = login;
        }
     
        public String getService() {
            return service;
        }
     
        public void setService(String service) {
            this.service = service;
        }
     
        public String getNummat() {
            return nummat;
        }
     
        public void setNummat(String nummat) {
            this.nummat = nummat;
        }
     
        public AdminService getAdminService() {
            return adminService;
        }
     
        public void setAdminService(AdminService adminService) {
            this.adminService = adminService;
        }
     
        public String getPassword() {
            return password;
        }
     
        public void setPassword(String password) {
            this.password = password;
        }
     
        public String seConnecter() {
            User user = adminService.getUser(nummat);
            if (user == null) {
                MessagesJsf.addErrorMessage("Le login n'est pas correct");
                return null;
            }
            if (!password.equals(user.getPassword())) {
                MessagesJsf.addErrorMessage("Le mot de passe n'est pas correct");
                return null;
            }
            this.setUserConnecte(user);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
                    Params.AUTH_KEY, nummat);
            login = null;
            password = null;
            return "home";
        }
    je continue de voir le meme user connecté à partir d'autres navigateurs

  6. #6
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Envoie le code de TalbusView, je pense que le problème vient de là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public String seConnecter() {
            User user = adminService.getUser(nummat);
            if (user == null) {
                MessagesJsf.addErrorMessage("Le login n'est pas correct");
                return null;
            }
            if (!password.equals(user.getPassword())) {
                MessagesJsf.addErrorMessage("Le mot de passe n'est pas correct");
                return null;
            }
            this.setUserConnecte(user);
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(
                    Params.AUTH_KEY, nummat);
            login = null;
            password = null;
            return "home";
        }

    Autre détail : quand tu renvoies un message d'erreur à la connexion, indique toujours "login ou mot de passe incorrect" plutôt de dire lequel des deux est incorrect (sinon on peut dire si un login existe ou pas, ce qui augmente les chances de pouvoir se connecter en faisant une attaque de type force brute)

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/09/2009, 15h46
  2. [MySQL] Problème de sessions multiples ?
    Par gaucthier dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/04/2009, 16h30
  3. Sessions multiples
    Par aziz1986 dans le forum Langage
    Réponses: 8
    Dernier message: 18/03/2009, 22h48
  4. Sessions multiples et variables qui ne passent pas
    Par franz.moraine dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2008, 20h48
  5. [C#] Session, éviter le log multiple
    Par Procto dans le forum ASP.NET
    Réponses: 7
    Dernier message: 26/05/2005, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo