【问题标题】:WebFilter urlPatterns ignoredWebFilter urlPatterns 被忽略
【发布时间】:2012-10-12 18:08:01
【问题描述】:

我已经阅读了许多示例,尽管我似乎拥有它们的“精确”副本,所以我无法弄清楚为什么当我导航到 /login 而不是 /restricted/* 时我的过滤器会执行。 我已经尝试过注释(如下例所示)和 XML 来定义 WebFilter。

网络过滤器

@WebFilter(filterName = "AuthenticationFilter", servletNames = { "Faces Servlet" }, urlPatterns = { "/restricted/*" } )
public class AuthenticationFilter implements Filter {
    @Inject
    private SessionManager sessionManager;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        System.out.println("Active AuthenticationFilter");
        if (sessionManager.getUser() == null) {
            ((HttpServletResponse) response).sendRedirect("/login");
        }
        else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

web.xml

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>   
<filter>
    <filter-name>Pretty Filter</filter-name>
    <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping> 
    <filter-name>Pretty Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>ERROR</dispatcher>
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>
<filter>
    <filter-name>NoCacheFilter</filter-name>
    <filter-class>filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>NoCacheFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>filter.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/restricted/*</url-pattern>
</filter-mapping>

注意

即使在两个文件中都定义了过滤器,我可以保证我不会同时使用这两种表示法。但是,为了测试和审查,我确实发布了它们。

我不熟悉网络过滤器的使用,并且找不到太多关于使用多个过滤器的信息。但是我读到的,你可以使用多个,它们会按照你在web.xml中定义的顺序执行。

问题

有没有人知道为什么我的过滤器也会在页面上以/login 执行? 该应用在 Glassfish 3.1.2 上运行。

【问题讨论】:

    标签: java jsf servlet-filters url-pattern


    【解决方案1】:

    &lt;filter-mapping&gt; 匹配条件不包括在内,它们是排他性的。

    具有以下映射

    <filter-mapping>
        <filter-name>AuthenticationFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/restricted/*</url-pattern>
    </filter-mapping>
    

    您基本上是在指示每当要调用 FacesServlet 时都应调用过滤器只要 URL 模式与 /restricted/* 匹配。

    这不是您所期望的“和”条件。只需删除 &lt;servlet-name&gt; 条目即可。

    正确的@WebFilter 声明应该是

    @WebFilter("/restricted/*")
    

    假设您不需要&lt;filter-mapping&gt;(例如,如果订单不相关)。

    【讨论】:

    • 嗯,好的,我试试看。我确实预料到了这种“和”的情况,因为我看到了许多定义了 servlet 名称的示例。我会在测试后报告我的发现。
    • 过滤器也可以完美地映射到特定的 servlet。这通常更容易,因为单个 servlet 可能会依次映射到多个 URL 模式(例如,某些 webapps 将 FacesServlet 映射到 /faces/**.faces*.jsf;在过滤器映射中重复这些模式会很乏味以及)。
    • 好吧,说实话。我距离试验 Servlet 还没有那么远。但我快到了,另一个挑战即将到来。回到主题,您的解决方案有效,而且我之前似乎已经工作过,但我误解了另一个错误(我的漂亮过滤器将/account 重定向到/restricted/account,因此预计会在/restricted/* 上受到打击,因为此过滤器位于漂亮过滤器之后,但这是由于相同的请求,不是吗?)。
    • 不客气。至于学习 servlet,我建议从我们的 [servlets] 标签 wiki 页面开始(主要是我自己编写的):stackoverflow.com/tags/servlets/info
    猜你喜欢
    • 2018-09-12
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2016-06-05
    • 2014-02-25
    • 2011-05-09
    • 2015-02-08
    相关资源
    最近更新 更多