2011-09-14 5 views
2

c:if 값이 true로 평가되면 사용자가 리디렉션되기를 원합니다. 리디렉션의 경우 c:redirect url="url"을 사용하고 있습니다. 하지만 그것은 나를 페이지로 리디렉션하지 않습니다. f가 JSF 코어 태그 라이브러리이다 c는 JSTL 코어 태그 라이브러리이다jstl core를 사용하여 리디렉션

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<f:view> 
<c:if test="#{user.loggedIn}"> 
    #{user.loggedIn} 
    <c:redirect url="index.xhtml"></c:redirect> 
</c:if> 

    Hello #{user.name} 

    <h:form> 
    <h:commandButton value="Logout" action="#{user.logout}" /> 
    </h:form> 
</f:view> 
여기

, h는 HTML을 JSF 태그 라이브러리를 나타낸다 : 여기서, 코드이다.

답변

2

보기 측면에서 요청/응답을 제어하지 마십시오. 컨트롤러 쪽에서하십시오. /app/*과 같이 제한된 페이지의 URL 패턴에 매핑하는 filter을 사용하십시오. JSF 세션 범위가 지정된 관리 Bean은 필터에 HttpSession 속성으로 사용 가능합니다.

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(false); 
    User user = (session != null) ? (User) session.getAttribute("user") : null; 

    if (user == null || !user.isLoggedIn()) { 
     response.sendRedirect("index.xhtml"); // No logged-in user found, so redirect to index page. 
    } else { 
     chain.doFilter(req, res); // Logged-in user found, so just continue request. 
    } 
} 

이 실패하는 이유는 JSF보기 응답과 응답이 이미 그 시점에서 커밋 된 부품 수 있다는 것이다. <c:redirect> 지점에서 서버 로그에 IllegalStateException: response already committed이 표시되어야합니다.

+0

''을 사용할 때 예외가 발생하지 않습니다. 내 질문은 ''에 지정된 URL로 리디렉션되지 않는 이유입니다. 응답의 의미는 무엇입니까? – Logan

+0

응답의 헤더가 이미 클라이언트 (웹 브라우저)로 전송되면 응답이 커밋됩니다. 리디렉션은 커밋되지 않은 응답이 필요합니다. 클라이언트가 지정된 위치 (즉, 리디렉션)에서 새 GET 요청을 보내도록 지시하기 위해 'Location'헤더를 설정해야하기 때문입니다. – BalusC