1

Filter如果他们想访问某些页面,我正在尝试使用 a强制我的用户登录。

所以我Filter必须将它们重定向到没有会话的错误页面。

但我不希望他们访问时发生这种情况index.html,因为他们可以登录索引页面。

所以我需要一个匹配除/和之外的所有页面的 URL 模式index.xhtml

我怎样才能做到这一点?我可以在我的 regex 中使用正则表达式web.xml吗?

编辑:

看完这篇

我以为我可以做类似的东西:

if (!req.getRequestURI().matches("((!?index)(.*)\\.xhtml)|((.*)\\.(png|gif|jpg|css|js(\\.xhtml)?))"))

在我的doFilter()方法中,但它仍然处理所有内容。

我确信正则表达式可以工作,因为我已经在线测试过它并且它匹配不需要过滤的文件,但是即使对于排除的文件也会执行 if 的内容!

编辑 2:

我正在尝试一种新方法。

我已将过滤器映射到*.xhtml我的web.xml.,所以我不需要使用上面的正则表达式排除 css、图像和 javascript。

这是新代码(进入doFilter()

if (req.getRequestURI().contains("index")) {
    chain.doFilter(request, response);
} else {
    if (!userManager.isLogged()) {
        request.getRequestDispatcher("error.xhtml").forward(request, response);
    } else {
        chain.doFilter(request, response);
    }
}

但它仍然没有,因为它chain.doFilter()在每一页上调用(在外部 if)。

如何排除我的索引页面被过滤?

4

1 回答 1

5

web.xmlURL 模式不支持正则表达式。它仅支持通配符前缀(文件夹)和后缀(扩展名)匹配,如 /faces/*and *.xhtml

至于您的具体问题,您显然已将索引文件定义为 a<welcome-file>并通过/. 这样request.getRequestURI()将等于/contextpath/,不是/contextpath/index.xhtml。调试request.getRequestURI()以了解过滤器实际检索到的内容。

我建议重写:

String path = request.getRequestURI().substring(request.getContextPath().length());

if (userManager.isLogged() || path.equals("/") || path.equals("/index.xhtml") || path.startsWith(ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/WEB-INF/error.xhtml").forward(request, response);
}

将此过滤器映射到/*. 请注意,我包含了ResourceHandler.RESOURCE_IDENTIFIER检查,以便 JSF 资源(如<h:outputStylesheet>,<h:outputScript>和)<h:graphicImage>也将被跳过,否则当用户未登录时,您最终会得到一个没有 CSS/JS/图像的索引页面。

请注意,我假设FacesServlet被映射到*.xhtml. 否则,您需要相应地更改/index.xhtml检查path

于 2012-05-22T20:56:11.510 回答