JSF Filter跳过一些文件

时间:2012-05-02 17:05:24

标签: jsf servlet-filters

我有一个具有这种结构的项目(我无法改变它):

Web Pages
   META-INF
   WEB-INF
   assets (javascript, css and images)
   includes (top.xhtml, bottom.xhtml, etc)
   templates (master.xhtml)
   views
      fornecedor
         -home.xhtml
         -user.xhtml
         -login.xhtml
      franqueador
         -home.xhtml
         -user.xhtml
         -login.xhtml

由于某个原因,每个文件夹都有login.xhtml,我无法更改它,它是由项目经理传递的。

这是我的SessionFilter:

@WebFilter("/views/*")
public class SessionFilter implements Filter {

    @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);
        LoginController loginController = (LoginController) ((boolean) (session != null) ? session.getAttribute("loginController") : null);
        if (!request.getRequestURI().endsWith("/fornecedor/index.xhtml")) {
            if (loginController == null || !loginController.getIsLoggedIn()) {
                response.sendRedirect(request.getContextPath()
                        + "/views/index.xhtml");
            } else {
                chain.doFilter(req, res);
            }
        }
    }


}

它不起作用,返回一个没有HTML代码的空白页面,当我将.xhtml更改为.html时,它会给我一个重定向循环。

我需要避免所有login.xhtml页面和index.xhtml views文件夹。我在我的过滤器上调试了if,但它总是返回false

修改

按照BalusC的回答,我来到这里:

if (!request.getRequestURI().endsWith("/views/index.html")
                && !request.getRequestURI().endsWith("/views/fornecedor/login.html")
                && !request.getRequestURI().endsWith("/views/franqueado/login.html")
                && (loginController == null || !loginController.getIsLoggedIn())) {
            response.sendRedirect(request.getContextPath() + "/views/index.html");

        } else {
            chain.doFilter(req, res);
        }

它正在工作,但还有另一个问题,如果我有10个文件夹,我需要在这个if语句中添加它们......我需要自动化。

1 个答案:

答案 0 :(得分:2)

您的第一个if条件没有else。这解释了空白页。

您需要在一个if中评估网址和登录条件。

if (!request.getRequestURI().endsWith("/fornecedor/index.xhtml") && (loginController == null || !loginController.getIsLoggedIn()) {
    response.sendRedirect(request.getContextPath() + "/views/index.xhtml");
} else {
    chain.doFilter(req, res);
}

关于重定向循环,这是因为您的FacesServlet映射到*.html而不是*.xhtml的网址格式,原因不明。因此请求URL永远不会匹配。相应地修复过滤器中的URL。要对所有login.htmlindex.html请求进行概括,请执行以下操作:

if (!request.getRequestURI().endsWith("/index.html") 
    && !request.getRequestURI().endsWith("/login.html") 
    && (loginController == null || !loginController.getIsLoggedIn())
{
    response.sendRedirect(request.getContextPath() + "/views/index.html");
} else {
    chain.doFilter(req, res);
}