2012-06-13 1 views
4

내 사용자를 인증 한 후 세션에 현재 로그인 한 사용자에 대한 참조를 넣으려고합니다.서블릿 필터 내의 FacesContext에서 세션을 가져 오지 못했습니다.

여기에 내가 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) 
    (...) 

?

내 컨트롤러의 전체 코드

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
보스 5.1.0.GA FacesContext가에서 사용할 수 없습니다

답변

11

a Filter은로은 전에FacesServlet 앞에 호출됩니다.

대신 request 인수에서 세션을 가져와야합니다.

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

당신은 JSF 컨텍스트에 들어가면 (예 : JSF는 콩 또는 JSF보기 관리 내에서) 매우 동일한 속성 이름을 getSessionMap()으로 사용할 수, 다음이 될 것

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

또는 단지로 EL에서 #{user} :

여기
@ManagedProperty("#{user}") 
private User user; 
-1

내가 무슨 짓을 :

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