如果我在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标签库,c
为JSTL核心标签库,f
为JSF核心标签库。
不要在视图端控制请求/响应。在控制器侧执行。使用映射到受限制页面的URL模式上的过滤器,例如/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
。