我使用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
不会让我。
我该如何使用它。
感谢。
答案 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)
答案 3 :(得分:2)
就像提到的其他人一样,你绝对不应该这样做,即使有可能。
Facelets是一个纯XML文档,由XML解析器解析,仅出于创建组件树的唯一原因。因此,仅用于组件布局。没有任何设施可以包含任何类型的scriptlet。
从技术上讲,有一些技巧会或多或少地给你你所追求的(错误的)习语。例如。您可以将该代码片段放在辅助bean中,并在每个页面的开头通过EL表达式调用它。您还可以创建基于Java的自定义组件,并将其放在每个页面的开头。最后,您可以定义自己的包含该代码的自定义EL函数并调用它。
但是我不能强调,这种方法很明显错误。使用mmanco和Bozho建议的过滤器或phaselistener。如果你不能忍受这个,那么JSF和Facelets可能不是最好的技术,你最好不要用JSP或PHP编程。