2012-01-26 2 views
2

JSF2 응용 프로그램이 있습니다. 나는 세션 스코프 된 로그인 빈과 뷰 범위 인 로그 아웃 빈을 가진다. 로그인 할 때 리디렉션을 사용하면 제대로 작동합니다. 그러나 리디렉션을 사용하면 로그 아웃이 실패합니다. 리디렉션없이 로그 아웃하면 작동합니다.로그 아웃 후 리디렉션 후 java.lang.IllegalStateException : 응답이 커밋 된 후 세션을 만들 수 없습니다.

@ManagedBean 
@ViewScoped 
public class MbLogout extends BaseJsf { 
    private static final long serialVersionUID = 2992671241358926373L; 

    public String logout() throws DfException { 
     getFacesContext().getExternalContext().invalidateSession(); 

     //return "login?faces-redirect=true"; // fails with this 
     return "login"; 
    } 
} 

로그인 페이지가 작동하지 않는 이유는 표시되지 않지만 그래서,이 함께 할 수있는 뭔가가 의심 로그인 빈에 바인딩을 가지고있다. 오류 :

java.lang.IllegalStateException: Cannot create a session after the response has been committed 

내 생각 엔 내가 세션 빈에 액세스하기 때문에 나는이 문제 아무것도 표시되지 않지만 로그인 페이지에서 세션을 생성하려고하고 리디렉션없이 작동합니다.

저는 MyFaces 2.1을 사용하고 있습니다.

답변

3

로그 아웃을 위해 bean 대신 Servlet을 사용하는 것이 좋습니다. 특히 관리 범위 (특히 뷰 범위)는 로그 아웃 목적에 적합하지 않습니다. 예를 들어 :

@WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"}) // Can be configured in web.xml aswell 
public class LogoutServlet extends HttpServlet { 

    private static final String redirectURL = "http://www.somepage.com"; 

    @Override 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // Destroys the session for this user. 
     if (request.getSession(false) != null) { 
      request.getSession(false).invalidate(); 
      } 
     response.sendRedirect(redirectURL); 
    } 
} 
+0

그건 생각하지 못했습니다. 나는 그것을 시도 할 것이다. 감사 – rozner

0

세션에서 직렬화되어야하는 뷰 범위에있는 bean과 관련이있는 것으로 보입니다. 대신 범위를 요청하도록합니다. 로그 아웃에 대해서는 뷰 범위가별로 중요하지 않습니다.

@ManagedBean 
@RequestScoped 
public class MbLogout extends BaseJsf { 
    // ... 
} 
관련 문제