Не удалось получить сеанс из 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


person Stephan    schedule 13.06.2012    source источник


Ответы (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;
person BalusC    schedule 13.06.2012

Вот что я сделал:

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);
person Leno de Baskelville    schedule 22.08.2017