82

我在我的 JSF 应用程序中使用 Servlet 过滤器。我的应用程序中有三组网页,我想在我的 Servlet 过滤器中检查这些页面的身份验证:

我的文件夹

/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

没有进入过滤器。

我必须为这 3 个文件夹提供安全保护。

如何解决这个问题呢 ?

4

2 回答 2

143

如果 URL 模式以 开头/,那么它是相对于上下文根的。/Admin/*URL 模式只会匹配页面 on http://localhost:8080/EMS2/Admin/*(假设这是/EMS2上下文路径),但实际上它们是 on http://localhost:8080/EMS2/faces/Html/Admin/*,因此您的 URL 模式永远不会匹配。

您需要/faces/Html像这样为您的 URL 模式添加前缀:

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

您也可以只重新配置您的 Web 项目结构/配置,以便您可以摆脱/faces/HtmlURL 中的路径,以便您可以通过例如http://localhost:8080/EMS2/Admin/Upload.xhtml.

您的过滤器映射语法一切正常。但是,指定多个 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>
于 2012-08-04T15:41:06.993 回答
21

如果您使用注解方法来定义过滤器(而不是在 中定义它们web.xml),您只需在@WebFilter注解中放置一个映射数组即可:

/**
 * Filter implementation class LoginFilter
 */
@WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginFilter implements Filter {
    ...

仅供参考,同样的事情也适用于使用 servlet 注释的 servlet:

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginServlet extends HttpServlet {
    ...
于 2014-09-17T19:59:41.363 回答