为Servletfilter提供多个URL模式

我在我的JSF应用程序中使用Servletfilter

我的应用程序中有三组网页

所以我想在我的Servletfilter中检查这个部分页面的身份validation

我的文件夹

/Admin/ *.xhtml /Supervisor/*.xhtml /Employee/*.xhtml 

和我写web.xml一样

 <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.ems.admin.servlet.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/Employee/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/Admin/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/Supervisor/*</url-pattern> </filter-mapping> 

但请求像

 http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml 

不进入filter。 我必须为这3个文件夹提供安全性

如何解决这个问题呢 ?

如果一个URL模式以/开始,那么它是相对于上下文根的。 /Admin/* URL模式只能匹配http://localhost:8080/EMS2/Admin/* (假设/EMS2是上下文path),但实际上它们在http://localhost:8080/EMS2/faces/Html/Admin/* ,所以你的URL模式永远不会匹配。

你需要用/faces/Html作为URL模式的前缀,就像这样:

 <url-pattern>/faces/Html/Admin/*</url-pattern> 

您也可以重新configuration您的Web项目结构/configuration,以便您可以摆脱URL中的/faces/Htmlpath,以便您可以打开页面,例如http://localhost:8080/EMS2/Admin/Upload.xhtml

你的filter映射语法都很好。 但是,指定多个URL模式的一个简单方法是只使用一个<filter-mapping>和多个<url-pattern>条目:

 <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/faces/Html/Employee/*</url-pattern> <url-pattern>/faces/Html/Admin/*</url-pattern> <url-pattern>/faces/Html/Supervisor/*</url-pattern> </filter-mapping> 

如果你使用servlet定义的annotation方法(而不是在web.xml定义它们),可以通过在@WebServlet注释中放入一个servlet映射数组来实现:

 /** * Servlet implementation class LoginFilter */ @WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"}) public class LoginFilter extends HttpServlet { ...