2011-09-14 9 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はJSFのHTML Taglibのを表す:ここでは、コードです。

答えて

2

ビュー側でリクエスト/レスポンスを制御しないでください。コントローラ側でやり直してください。制限付きページのURLパターンにマップするfilterを使用してください(/app/*など)。 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

レスポンスのヘッダがクライアント(webbrowser)にすでに送信されている場合、レスポンスがコミットされます。リダイレクトにはコミットされていない応答が必要です。クライアントに指定された場所(つまりリダイレクト)で新しいGET要求を送信するように指示するには、 'Location'ヘッダを設定する必要があるからです。 – BalusC

関連する問題