只需执行与容器已完成的相同的工作即可。即,按照servlet过滤器所使用的方法,彻底改造责任链设计模式。
public class GodFilter implements Filter { private Map<Pattern, Filter> filters = new linkedHashMap<Pattern, Filter>(); @Override public void init(FilterConfig config) throws ServletException { Filter1 filter1 = new Filter1(); filter1.init(config); filters.put(new Pattern("/foo/*"), filter1); Filter2 filter2 = new Filter2(); filter2.init(config); filters.put(new Pattern("*.bar"), filter2); // ... } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest hsr = (HttpServletRequest) request; String path = hsr.getRequestURI().substring(hsr.getContextPath().length()); GodFilterChain godChain = new GodFilterChain(chain); for (Entry<Pattern, Filter> entry : filters.entrySet()) { if (entry.getKey().matches(path)) { godChain.addFilter(entry.getValue()); } } godChain.doFilter(request, response); } @Override public void destroy() { for (Filter filter : filters.values()) { filter.destroy(); } }}与那些小的帮助程序类(如果需要,可以将
private static其作为上述的嵌套类
GodFilter):
public class Pattern { private int position; private String url; public Pattern(String url) { this.position = url.startsWith("*") ? 1: url.endsWith("*") ? -1: 0; this.url = url.replaceAll("/?\*", ""); } public boolean matches(String path) { return (position == -1) ? path.startsWith(url) : (position == 1) ? path.endsWith(url) : path.equals(url); }}和
public class GodFilterChain implements FilterChain { private FilterChain chain; private List<Filter> filters = new ArrayList<Filter>(); private Iterator<Filter> iterator; public GodFilterChain(FilterChain chain) { this.chain = chain; } @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { if (iterator == null) { iterator = filters.iterator(); } if (iterator.hasNext()) { iterator.next().doFilter(request, response, this); } else { chain.doFilter(request, response); } } public void addFilter(Filter filter) { if (iterator != null) { throw new IllegalStateException(); } filters.add(filter); }}如有必要,您还可以将XML配置文件与所有可能的过滤器一起输入,以使最终配置更加容易。你可以使用反射来创建过滤器
init()你的
GodFilter。
哦,没关系,这就是
web.xml容器已经在做的…



