使用Tuckey URL重写时,仅针对JSF页面而非静态资源的过滤器模式

使用Tuckey URL重写时,仅针对JSF页面而非静态资源的过滤器模式,jsf,servlet-filters,Jsf,Servlet Filters,我正在实现一个过滤器,将过期用户重定向到密码页面 我还使用Tuckey URL重写来隐藏.xhtml扩展名 我现在的问题是,如何设置过滤器,使其只过滤JSF页面而不过滤静态资源?在URL重写过滤器之后,当您在web.xml中映射用户过滤器时,您不需要更改用户过滤器的逻辑,并且它也会在转发上显式调度。这样,传入的请求URL/URI将只是原始的URL/URI。默认情况下,过滤器是在REQUEST上调度的,当链中的其他过滤器执行RequestDispatcher#forward()调用时,这将错过命中

我正在实现一个过滤器,将过期用户重定向到密码页面

我还使用Tuckey URL重写来隐藏.xhtml扩展名


我现在的问题是,如何设置过滤器,使其只过滤JSF页面而不过滤静态资源?

在URL重写过滤器之后,当您在
web.xml
中映射用户过滤器时,您不需要更改用户过滤器的逻辑,并且它也会在
转发上显式调度。这样,传入的请求URL/URI将只是原始的URL/URI。默认情况下,过滤器是在
REQUEST
上调度的,当链中的其他过滤器执行
RequestDispatcher#forward()
调用时,这将错过命中,就像URL重写过滤器一样

<!-- Should be placed *after* URL rewrite filter. -->
<filter-mapping>
    <filter-name>yourLoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
不管是哪种方式,请注意,如果您也希望允许原始URL(因此您没有配置URL重写筛选器将其重定向到重写的URL),那么您需要明确指定
请求
调度程序,如上所示,否则,当用户使用原始URL直接请求页面时,过滤器将不会运行。如果您不允许原始URL,只需删除
请求

也就是说,“静态资源”一词在这种情况下有点含糊不清。您当然想说喜欢CSS/JS/image资源,但是上面的过滤器仍然包括JSF通过
等管理的过滤器,它们都有
/javax.faces.resource/*
URL模式。您最好对请求URL在筛选器中执行附加检查,如下所示:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    boolean facesResourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");

    if (facesResourceRequest)) {
        chain.doFilter(request, response); // Skip JSF resources.
        return;
    }

    // Your original filter code here.
}
另见:

排列这些JSF页面的方式允许您使用仅覆盖JSF页面的URL模式映射所讨论的
过滤器。@tiny这不是一个非常健壮的选项。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    boolean facesResourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");

    if (facesResourceRequest)) {
        chain.doFilter(request, response); // Skip JSF resources.
        return;
    }

    // Your original filter code here.
}