Bonjour,
J'utilise des variable de Session HttpSession pour sauvegarder des connexions utilisateurs. Est-il possible de toutes les récupérer au sein d'un bean en applicationScoped ? (afin de pouvoir récupérer les utilisateurs connectés). Merci.
Bonjour,
J'utilise des variable de Session HttpSession pour sauvegarder des connexions utilisateurs. Est-il possible de toutes les récupérer au sein d'un bean en applicationScoped ? (afin de pouvoir récupérer les utilisateurs connectés). Merci.
Dans le principe oui, est-ce que c'est une bonne idée, je ne sais pas...
Tu pourrais t'en sortir en utilisant une classe implémentant HttpSessionListener.
Là tu as à disposition 2 méthodes :
- sessionCreated(HttpSessionEvent)
- sessionDestroyed(HttpSessionEvent)
Tu peux donc ajouter ou supprimer les identifiants de session (ou l'objet session) dans le contexte application.
J'ai créé ce listener, mais apparemment les sessions persistent c pas vraiment du temps réel, merci de m'avoir mis sur la voie :
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 package listeners; import beans.ApplicationBean; import classes.Data; import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import mapping.MappedUsers; /** * * @author pj */ public class SessionListener implements HttpSessionAttributeListener { private final List<MappedUsers> mappedUsers; public SessionListener() { mappedUsers = new ArrayList<>(); } public FacesContext getFacesContext() { return FacesContext.getCurrentInstance(); } @Override public void attributeAdded(HttpSessionBindingEvent event) { if (event.getName().equals(Data.USERSESSION)) { MappedUsers mu = (MappedUsers) event.getSession().getAttribute(Data.USERSESSION); boolean flag = false; for (MappedUsers mu2 : mappedUsers) { if (mu2.getId() == (long) mu.getId()) { flag = true; break; } } if (!flag) { mappedUsers.add(mu); ApplicationBean applicationBean = (ApplicationBean) getFacesContext().getApplication().createValueBinding("#{applicationBean}").getValue(getFacesContext()); applicationBean.setMappedUsers(mappedUsers); } } } @Override public void attributeRemoved(HttpSessionBindingEvent event) { if (event.getName().equals(Data.USERSESSION)) { MappedUsers mu = (MappedUsers) event.getSession().getAttribute(Data.USERSESSION); boolean flag = false; int i = 0; for (MappedUsers mu2 : mappedUsers) { if (mu2.getId() == (long) mu.getId()) { flag = true; break; } i++; } if (flag) { mappedUsers.remove(i); ApplicationBean applicationBean = (ApplicationBean) getFacesContext().getApplication().createValueBinding("#{applicationBean}").getValue(getFacesContext()); applicationBean.setMappedUsers(mappedUsers); } } } @Override public void attributeReplaced(HttpSessionBindingEvent event ) { } }
Soit je n'ai pas compris ton besoin soit tu t'es trompé.
Le HttpSessionAttributeListener est intéressant quand tu veux suivre les ajouts/suppression d'un attribut dans une session, rien à voir avec la création/suppression d'une session.
Pour suivre la session, il faut utiliser le HttpSessionListener.
Pour déterminer par exemple à quel utilisateur appartient une session, tu peux toujours tester un attribut de la session qui identifierait ton utilisateur.
L'event contenant l'objet Session, cet objet étant stocké dans un scope Application, ton process peux très bien faire un session.getAttribute("unNom").
Bien sûr, ça suppose que tu ais prévu de mettre un tel objet en session![]()
Comme je n'ai pas réussi à récupérer les sessions dans HttpSessionListener j'ai trouvé une autre méthode : mes sessions sont des Objets MappedUsers donc j'ai implémenté la classe avec HttpSessionBindingListener puis ajouté ces 2 méthodes :
et dans applicationBean :
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 @Override public void valueBound(HttpSessionBindingEvent event) { if (event.getName().equals(Data.USERSESSION)) { MappedUsers mu = (MappedUsers) event.getValue(); if (mu != null) { ApplicationBean applicationBean = (ApplicationBean) getFacesContext().getApplication().createValueBinding("#{applicationBean}").getValue(getFacesContext()); applicationBean.addUser(mu); } } } @Override public void valueUnbound(HttpSessionBindingEvent event) { if (event.getName().equals(Data.USERSESSION)) { MappedUsers mu = (MappedUsers) event.getValue(); if (mu != null) { ApplicationBean applicationBean = (ApplicationBean) getFacesContext().getApplication().createValueBinding("#{applicationBean}").getValue(getFacesContext()); applicationBean.removeUser(mu); } } }
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 public void addUser(MappedUsers mu) { boolean f = true; long id = mu.getId(); for (MappedUsers mu2 : mappedUsers) { if (mu2.getId() == id) { f = false; break; } } if (f) { mappedUsers.add(mu); } } public void removeUser(MappedUsers mu) { boolean f = false; int i = 0; long id = mu.getId(); for (MappedUsers mu2 : mappedUsers) { if (mu2.getId() == id) { f = true; break; } i++; } if (f) { mappedUsers.remove(i); } }
Partager