如何在JSF中将用户重定向到登录页面

时间:2011-03-08 08:55:30

标签: jsf jsf-2 facelets

我使用JSF 2.0和facelets。我想在每个页面登录检查,如果失败则重定向到登录页面......

<%
HttpSession sess = request.getSession(true);

if (sess.getAttribute("userName") == null ) {
%>
<jsp:forward page="/login.xhtml"/>
<%
return;
} else {
    // some code
%>
    <%-- some other code --%>
<%
}
%>

当我写这段代码时,Netbeans IDE不会让我。

我该如何使用它。

感谢。

4 个答案:

答案 0 :(得分:3)

我建议使用过滤器代替jsp。然后,将其定义为web.xml中的第一个过滤器之一。

public class DirectAccessBlockFilter implements Filter {

    private String loginPage = "login.xhtml";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpSession session = httpRequest.getSession(false);

        if(session.getAttribute("userName") == null && !httpRequest.getServletPath().contains(loginPage)) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(loginPage);
            dispatcher.forward(request, response);          
            return;
        }

        chain.doFilter(request, response);
    }

}

答案 1 :(得分:3)

不能那样做。这是完全不可能的,因为facelets 不是 JSP。 Scriptlet不存在。

此外,这种事情应该在servlet过滤器中实现,而不是在单个页面上实现。此外,您不应该自己动手,而是使用免费提供的成熟实现之一:

答案 2 :(得分:2)

不要这样做。由于某种原因,Facelets是默认视图。

登录检查应改为以下任一方式:

答案 3 :(得分:2)

就像提到的其他人一样,你绝对不应该这样做,即使有可能。

Facelets是一个纯XML文档,由XML解析器解析,仅出于创建组件树的唯一原因。因此,用于组件布局。没有任何设施可以包含任何类型的scriptlet。

从技术上讲,有一些技巧会或多或少地给你你所追求的(错误的)习语。例如。您可以将该代码片段放在辅助bean中,并在每个页面的开头通过EL表达式调用它。您还可以创建基于Java的自定义组件,并将其放在每个页面的开头。最后,您可以定义自己的包含该代码的自定义EL函数并调用它。

但是我不能强调,这种方法很明显错误。使用mmanco和Bozho建议的过滤器或phaselistener。如果你不能忍受这个,那么JSF和Facelets可能不是最好的技术,你最好不要用JSP或PHP编程。