2012-05-02 127 views
2

我有一个项目,这个结构(我不能改变它):JSF过滤器跳过一些文件

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.xhtmlviews文件夹。我在我的过滤器上调试了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声明...我需要使其自动。

回答

2

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

您需要改为使用一个if来评估URL和登录条件。

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一些不明原因的URL模式,而不是*.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); 
} 
+0

您好,感谢您的回答,但怎么样'@WebFilter(“/视图/ *”)'?就这样离开吗? – Gerep

+0

此批注将过滤器注册到应用程序中,并让它在匹配'/ views/*'的URL模式上运行。如果删除它,过滤器将不会被注册,因此根本不会运行。 – BalusC

+0

但在我的情况下,我的'views'文件夹中有一些文件夹,正确的选择是让它这样吗? '@WebFilter(“/ views/*”)' – Gerep