4

ユーザーを認証した後、現在ログインしているユーザーへの参照をセッションに入れたいと思います。

ここで、メソッドでそれを行うsetCurrentUser方法:

FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.setAttribute("CURRENT_USER", currentUser);

残念ながら、session参照は常に null です!

または、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)
    (...)

私は何を間違っていますか?

私のコントローラーの完全なコード

ユーザーコントローラー.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

4

2 に答える 2

11

はのに呼び出されるため、FacesContextでは使用できません。FilterFilterFacesServlet

request代わりに、引数からセッションを取得する必要があります。

HttpSession session = ((HttpServletRequest) request).getSession();
session.setAttribute("user", currentUser);
// ...

JSF コンテキスト (JSF マネージド Bean または JSF ビュー内など) に入るとgetSessionMap()、まったく同じ属性名で使用できるようになります。

User user = (User) externalContext.getSessionMap().get("user");

または単に#{user}ELで:

@ManagedProperty("#{user}")
private User user;
于 2012-06-13T11:57:29.890 に答える