Regex 在除索引之外的所有页面上使用Servlet过滤器

Regex 在除索引之外的所有页面上使用Servlet过滤器,regex,servlets,servlet-filters,regex-negation,Regex,Servlets,Servlet Filters,Regex Negation,我试图使用过滤器强制我的用户登录,如果他们想访问某些页面 因此,我的过滤器必须在没有会话的情况下将它们重定向到错误页面 但我不希望在他们访问index.html时发生这种情况,因为他们可以登录索引页面 因此,我需要一个URL模式来匹配除/和index.xhtml之外的所有页面 我该怎么做?我可以在我的web.xml中使用正则表达式吗 编辑: 读后 我想我可以做一些像: if (!req.getRequestURI().matches("((!?index)(.*)\\.xhtml)|((.*)\

我试图使用
过滤器
强制我的用户登录,如果他们想访问某些页面

因此,我的
过滤器
必须在没有会话的情况下将它们重定向到错误页面

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

因此,我需要一个URL模式来匹配除
/
index.xhtml
之外的所有页面

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

编辑:

读后

我想我可以做一些像:

if (!req.getRequestURI().matches("((!?index)(.*)\\.xhtml)|((.*)\\.(png|gif|jpg|css|js(\\.xhtml)?))"))
在我的
doFilter()
方法中,但它仍然处理所有内容

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

编辑2:

我在尝试一种新方法

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

以下是新代码(进入
doFilter()

但它仍然没有,因为它在每个页面上调用
链.doFilter()
(在外部if中)


如何将索引页排除在筛选之外?

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

至于您的具体问题,您显然已经将索引文件定义为
,并且正在通过
/
打开它。这样,
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);
}
将此筛选器映射到
/*
。请注意,我包含了这个检查,这样像
这样的JSF资源也将被跳过,否则当用户未登录时,您将得到一个没有CSS/JS/图像的索引页


注意,我假设
FacesServlet
映射在
*.xhtml
的URL模式上。否则,您需要相应地修改
/index.xhtml
路径上的
检查。

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

至于您的具体问题,您显然已经将索引文件定义为
,并且正在通过
/
打开它。这样,
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);
}
将此筛选器映射到
/*
。请注意,我包含了这个检查,这样像
这样的JSF资源也将被跳过,否则当用户未登录时,您将得到一个没有CSS/JS/图像的索引页


注意,我假设
FacesServlet
映射在
*.xhtml
的URL模式上。否则,您需要相应地更改
/index.xhtml
路径上的
检查。

您会知道,我的索引页设置为欢迎文件,但是
请求.getRequestURI()
打印
/contextpath/index.xhtml
,这就是为什么我觉得奇怪的原因。我会尽快尝试你的解决方案,谢谢!没错,我的索引页设置为欢迎文件,但是
request.getRequestURI()
打印
/contextpath/index.xhtml
,这就是为什么我觉得奇怪的原因。我会尽快尝试你的解决方案,谢谢!