WebFilter urlPatterns被忽略了

时间:2012-10-22 21:00:01

标签: java jsf servlet-filters url-pattern

虽然我似乎有一个'确切'的副本,但我已经阅读了很多例子,所以当我导航到/login而不是/restricted/*时,我无法弄清楚为什么我的过滤器会执行。 我尝试了两种注释(如下例所示)和XML来定义WebFilter。

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>

注意

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

我是webfilters的新手,并且对使用多个过滤器一无所知。但是我读过的内容,您可以使用多个,它们将按照您在web.xml中定义的顺序执行。

问题

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

1 个答案:

答案 0 :(得分:6)

<filter-mapping>匹配条件不包含在内,它们是独占的。

使用以下映射

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

当网址模式与FacesServlet匹配时,每当要调用{strong>或 /restricted/*时,您基本上都会指示过滤器。

这不是&#34;和&#34;你似乎期待的条件。只需删除<servlet-name>条目。

正确的@WebFilter声明将是

@WebFilter("/restricted/*")

假设您不需要<filter-mapping>(例如,如果订单无关紧要)。