【问题标题】:Giving multiple URL patterns to Servlet Filter为 Servlet 过滤器提供多个 URL 模式
【发布时间】:2012-07-23 15:15:39
【问题描述】:

我在我的 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 个文件夹提供安全保护。

如何解决这个问题?

【问题讨论】:

    标签: servlets servlet-filters url-pattern


    【解决方案1】:

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

    您需要在您的 URL 模式前加上 /faces/Html 前缀,如下所示:

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

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

    您的过滤器映射语法一切正常。但是,指定多个 URL 模式的一种更简单的方法是仅使用一个 &lt;filter-mapping&gt; 和多个 &lt;url-pattern&gt; 条目:

    <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>
    

    【讨论】:

    • 据我所知,不允许使用多个 url-pattern 元素,并且不能按预期工作。
    • @SebastianG:您的具体问题是由其他地方引起的。请注意,Servlet 2.5(Java EE 5 的一部分,大约 7 年前发布)中引入了对多个 &lt;url-pattern&gt; 元素的支持。也许您正在研究史前野兽,或者您有严重的配置问题,导致您的容器以匹配 Servlet 2.4 或更早版本的回退方式运行,从而失去所有 Servlet 2.5 功能。
    • 请注意,如果多个&lt;filter-mapping&gt; 匹配相同的资源,它们将执行相同的过滤器两次,例如,一个使用/*,另一个使用/foo.xhtml 作为url-pattern。我在 JBoss AS 7.1 上遇到了这种行为。
    • @Paranaix:这确实是指定的行为。也许你正在混合 servlet 映射,它确实只会执行具有最佳匹配 URL 模式的 servlet。
    【解决方案2】:

    如果您使用注释方法来定义过滤器(而不是在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 {
        ...
    

    【讨论】:

    • 扩展一个Filter而不是HttpServlet不是更好吗?即使这只是一个例子?
    • 可以针对不同的 servlet URL 模式执行过滤器。您不能用 servlet 替换过滤器。
    • 他想要一种过滤器行为,而不是 servlet 行为。我猜他已经将这些 URL 映射到 servlet。
    猜你喜欢
    • 2011-10-17
    • 2014-06-13
    • 2014-10-20
    • 2015-09-06
    • 2010-12-25
    • 1970-01-01
    • 2019-03-06
    • 2012-08-02
    • 2015-10-06
    相关资源
    最近更新 更多