栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在不修改web.xml的情况下将过滤器添加到servlet

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在不修改web.xml的情况下将过滤器添加到servlet

只需执行与容器已完成的相同的工作即可。即,按照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
容器已经在做的…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496532.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号