2011-09-14 54 views
2

如果我在c:if中檢查的值評估爲true,我希望用戶重定向。爲了重定向,我使用c:redirect url="url"。但它不會將我重定向到頁面。下面是代碼:使用jstl核心重定向重定向

<!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標籤庫,c是JSTL核心標籤庫,f是JSF核心標籤庫。

回答

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

當響應頭已經發送到客戶端(網頁瀏覽器)時提交響應。重定向需要一個未提交的響應,因爲需要設置「位置」標頭,以便指示客戶端在給定位置發送新的GET請求(所以,重定向)。 – BalusC