简短问题:是否可以进行重定向,例如当用户未登录时,何时呈现页面?
答案 0 :(得分:9)
E.g。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
((HttpServletResponse) response).sendRedirect("error.jsf"); // Not logged in, so redirect to error page.
} else {
chain.doFilter(request, response); // Logged in, so just continue.
}
}
这里我假设User
已经按照您通常的预期放在会话范围内。它可以是名为user
的会话作用域JSF托管bean。
导航规则不适用,因为在正常GET
请求期间无法执行“bean操作”。在即将构建托管bean时进行重定向也无法工作,因为在正常GET
请求期间构建托管bean时,响应已经开始呈现,这是一个点无回报(它只会产生IllegalStateException: response already committed
)。 PhaseListener很麻烦且非常庞大,因为您实际上不需要监听任何JSF阶段。您只想听取“普通”HTTP请求以及会话范围中某个对象的存在。为此,过滤器是完美的。
答案 1 :(得分:3)
是的:
if(!isLoggedIn) {
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
}
答案 2 :(得分:1)
您可以使用PhaseListener
指定何时进行重定向。
答案 3 :(得分:1)
在PhaseListener
尝试:
FacesContext ctx = FacesContext.getCurrentContext();
ctx.getApplication().getNavigationHandler()
.handleNavigation(ctx, null, "yourOutcome");