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

O имеет 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.

EDIT

После 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. Это объясняет пустую страницу.

Необходимо вместо этого оценить URL-адрес и условия входа в систему только в одном 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 отображается на шаблон URL в *.html вместо *.xhtml по какой-то неясной причине. Таким образом, URL-адрес запроса никогда не совпадает. Исправьте URL-адреса в фильтре. Для того, чтобы обобщить все login.html и index.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

Эта аннотация регистрирует фильтр в приложении и позволяет запускать URL-шаблоны, соответствующие '/ views/*'. Если вы удалите это, фильтр не будет вообще зарегистрирован и, следовательно, не будет запущен вообще. – BalusC

+0

, но в моем случае у меня есть несколько папок внутри папки 'views', правильный выбор - оставить его таким образом? '@WebFilter ("/views/* ")' – Gerep

Смежные вопросы