【问题标题】:Using Servlet filter on all the pages except the index在除索引之外的所有页面上使用 Servlet 过滤器
【发布时间】:2012-05-22 19:23:31
【问题描述】:

我正在尝试使用Filter 来强制我的用户在他们想要访问某些页面时登录。

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

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

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

我该怎么做?我可以在web.xml 中使用正则表达式吗?

编辑:

看完this

我认为我可以制作类似的东西:

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

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

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

编辑 2:

我正在尝试一种新方法。

我已经在web.xml 中将过滤器映射到*.xhtml,所以我不需要使用上面的正则表达式排除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 中)。

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

【问题讨论】:

    标签: regex servlets servlet-filters regex-negation


    【解决方案1】:

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

    至于您的具体问题,您显然已将索引文件定义为<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 的URL 模式。否则,您需要相应地更改/index.xhtml 检查path

    【讨论】:

    • 没错,我的索引页设置为欢迎文件,但request.getRequestURI() 打印/contextpath/index.xhtml,这就是为什么这对我来说很奇怪。我会尽快尝试您的解决方案,谢谢!
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2011-04-20
    • 2013-12-15
    • 1970-01-01
    • 2014-02-07
    • 2019-12-05
    相关资源
    最近更新 更多