Impossible de récupérer la Session de FacesContext à l'intérieur d'un Filtre de Servlet
Après autheticating mon utilisateur, je veux mettre une référence dans la session courante de l'utilisateur connecté.
Voici comment je le fais dans la setCurrentUser
méthode :
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute("CURRENT_USER", currentUser);
Malheureusement, la session
de référence est toujours nulle !
Sinon, j'ai essayé avec le sessionMap
FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap();
sessionMap.put("CURRENT_USER", currentUser);
Il a lamentablement échoué avec cette exception :
java.lang.UnsupportedOperationException
at java.util.AbstractMap.put(AbstractMap.java:186)
(...)
Ce que je fais mal ?
Le code complet de mon contrôleur
UserController.java
public class UserController implements Filter {
private FilterConfig fc;
private static final String CURRENT_USER = "CURRENT_USER";
public void init(FilterConfig filterConfig) throws ServletException {
fc = filterConfig;
log(">> Filter initialized");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//Authenticate user
//...
//Save refernce in Session
setCurrentUser(currentUser);
//(...)
}
public static void setCurrentUser(User u) {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute(CURRENT_USER, u);//session is always NULL
}
public static User getCurrentUser() {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
return (User)session.getAttribute(CURRENT_USER);
}
//...
}
JSF 2.0
JBoss 5.1.0.GA
OriginalL'auteur Stephan | 2012-06-13
Vous devez vous connecter pour publier un commentaire.
La
FacesContext
n'est pas disponible dans unFilter
comme leFilter
est invoquée avant laFacesServlet
.Vous devez obtenir de la session à partir de la
request
argument à la place.Une fois que vous êtes dans JSF contexte (par exemple, à l'intérieur d'un managed bean JSF ou une vue JSF), puis ce sera à disposition par
getSessionMap()
sur le même nom d'attributOu tout simplement par
#{user}
dans EL:OriginalL'auteur BalusC
Voici ce que j'ai fait:
Et puis, pour initialiser la session, j'ai simplement exécuté:
OriginalL'auteur Leno de Baskelville