Не удалось получить сеанс из FacesContext внутри фильтра сервлета
После аутентификации моего пользователя я хочу поместить ссылку в сеанс на текущего вошедшего в систему пользователя.
Вот как я это делаю в setCurrentUser
метод:
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute("CURRENT_USER", currentUser);
К сожалению, session
ссылка всегда нулевая!
В качестве альтернативы я попытался с помощью sessionMap
FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap();
sessionMap.put("CURRENT_USER", currentUser);
Это с треском провалилось с этим исключением:
java.lang.UnsupportedOperationException
at java.util.AbstractMap.put(AbstractMap.java:186)
(...)
Что я делаю неправильно?
Полный код моего контроллера
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
2 ответа
FacesContext
недоступен в Filter
как Filter
вызывается до FacesServlet
,
Вы должны получить сессию от request
аргумент вместо.
HttpSession session = ((HttpServletRequest) request).getSession();
session.setAttribute("user", currentUser);
// ...
Когда вы находитесь в контексте JSF (например, внутри управляемого JSF-компонента или представления JSF), это будет доступно getSessionMap()
на то же имя атрибута
User user = (User) externalContext.getSessionMap().get("user");
Или просто #{user}
в EL:
@ManagedProperty("#{user}")
private User user;
Вот что я сделал:
public class SesionUtil implements Serializable {
private static final long serialVersionUID = 1L;
public void setSesionUsuario(String key, Object value) {
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(key, value);
}
public String getSesionUsuario(String key) {
return FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(key).toString();
}
}
И затем, чтобы инициализировать сеанс, я просто выполнил:
@Inject // Inject dependency
private SesionUtil sessionUtil;
...
sessionUtil.setSesionUsuario("nombreUsuario",nombre);