使用jstl核心重定向重定向

时间:2011-09-14 12:32:33

标签: jsf redirect jstl

如果我在c:if中检查的值被评估为true,我希望用户被重定向。对于重定向,我使用的是c:redirect url="url"。但它并没有将我重定向到页面。这是代码:

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

1 个答案:

答案 0 :(得分:2)

不要在视图端控制请求/响应。在控制器端执行此操作。使用您在受限制网页的网址格式上映射的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视图是响应的一部分,并且响应可能已在此时提交。您应该已经在调用IllegalStateException: response already committed点的服务器日志中看到<c:redirect>