JSF过滤器跳过一些文件

JSF过滤器跳过一些文件,jsf,servlet-filters,Jsf,Servlet Filters,我有一个具有此结构的项目(我无法更改): O每个文件夹都有一个login.xhtml,由于某种原因,我无法更改它,它是由项目经理传递的 这是我的会话筛选器: @WebFilter("/views/*") public class SessionFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) t

我有一个具有此结构的项目(我无法更改):

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

这是我的会话筛选器:

@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
页面和
views
文件夹中的
index.xhtml
。我已经在我的过滤器上调试了
if
,但它总是返回
false

编辑

根据巴卢斯克的回答,我得出以下结论:

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
语句中…我需要使其自动。

如果
条件没有
其他
,您的第一个
。这解释了空白页。

您需要在单个
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.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);
}

您好,谢谢您的回答,但是
@WebFilter(“/views/*”)
呢?就这样吧?此注释在应用程序中注册过滤器,并允许它在匹配
/views/*
的URL模式上运行。如果删除此选项,则筛选器将根本不会注册,因此根本不会运行。但在我的情况下,我的
视图
文件夹中有一些文件夹,正确的选择是将其保留为这种方式
@WebFilter(“/views/*”)
它将在与
/views/*
匹配的每个URL模式上运行,因此也将
/views/someotherfolder/file.xhtml
。但是,我再次阅读了您的问题,似乎您实际上在每个文件夹中都有一个
index.xhtml
(即使在文件夹结构示例中没有显示),并且您希望以与
login.xhtml
相同的方式处理
index.xhtml
。这是真的吗?您的
FacesServlet
映射到什么URL模式也不清楚。它是
*.xhtml
还是
*.html
?筛选器中选中的请求URL和重定向的URL必须与该URL模式完全匹配。我的文件夹中没有
索引.xhtml
,只有
视图中的
和URL模式是
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);
}