public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
        if (this.filters == null || this.filters.size() == this.index) {
            //we've reached the end of the wrapped chain, so invoke the original one:
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Invoking original filter chain.");
            }
            this.orig.doFilter(request, response);
        } else {
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Invoking wrapped filter at index [" + this.index + "]");
            }
            this.filters.get(this.index++).doFilter(request, response, this);
        }
    }
A proxied filter chain is a {@link FilterChain} instance that proxies an original {@link FilterChain} as well
as a {@link List List} of other {@link Filter Filter}s that might need to execute prior to the final wrapped
original chain.  It allows a list of filters to execute before continuing the original (proxied)
{@code FilterChain} instance.

@since 0.9
web/src/main/java/org/apache/shiro/web/servlet/ProxiedFilterChain.java