package com.mossle.core.servlet; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class BeforeInvocationFilter implements Filter { private List<Filter> filters = new ArrayList<Filter>(); public void setFilters(List<Filter> filters) { this.filters = new ArrayList<Filter>(filters); } public void addFirstFilter(Filter filter) { this.filters.add(0, filter); } public void destroy() { for (int i = filters.size(); i-- > 0;) { Filter filter = filters.get(i); filter.destroy(); } } public void init(FilterConfig config) throws ServletException { for (Filter filter : filters) { filter.init(config); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ProxyFilterChain proxyFilterChain = new ProxyFilterChain(); for (Filter filter : filters) { proxyFilterChain.setInvokeNextFilter(false); filter.doFilter(request, response, proxyFilterChain); if (!proxyFilterChain.isInvokeNextFilter()) { return; } } chain.doFilter(request, response); } private static final class ProxyFilterChain implements FilterChain { private boolean invokeNextFilter = false; public void doFilter(ServletRequest request, ServletResponse response) { this.invokeNextFilter = true; } public boolean isInvokeNextFilter() { return invokeNextFilter; } public void setInvokeNextFilter(boolean invokeNextFilter) { this.invokeNextFilter = invokeNextFilter; } } }