为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/Html
path,以便您可以打开页面,例如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 { ...