Jsf 无法从Servlet筛选器内的FacesContext检索会话

Jsf 无法从Servlet筛选器内的FacesContext检索会话,jsf,session,servlet-filters,facescontext,Jsf,Session,Servlet Filters,Facescontext,对我的用户进行身份验证后,我想在会话中引用当前登录的用户 下面是我如何在setCurrentUser方法中执行此操作的: FacesContext facesContext = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); session.setAttribute("CURRENT_USER", c

对我的用户进行身份验证后,我想在会话中引用当前登录的用户

下面是我如何在
setCurrentUser
方法中执行此操作的:

FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute("CURRENT_USER", currentUser);
不幸的是,
会话
引用总是空的

或者,我尝试使用sessionMap

FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap();
sessionMap.put("CURRENT_USER", currentUser);
我做错了什么

我的控制器的完整代码

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);
    }

    //...   
}
JSF2.0

JBoss 5.1.0.GA

由于在
FacesServlet
之前调用了
过滤器,因此
FacesContext
过滤器中不可用

您应该从
请求
参数获取会话

HttpSession session = ((HttpServletRequest) request).getSession();
session.setAttribute("user", currentUser);
// ...
一旦您处于JSF上下文中(例如,在JSF托管bean或JSF视图中),那么这将通过
getSessionMap()
在相同的属性名称上提供

User user = (User) externalContext.getSessionMap().get("user");
或者仅通过EL中的
{user}

@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);
@Inject // Inject dependency
private SesionUtil sessionUtil;

...

sessionUtil.setSesionUsuario("nombreUsuario",nombre);