2012-05-02 124 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