【问题标题】:Add servlet filter for multiple paths in embedded Jetty为嵌入式 Jetty 中的多个路径添加 servlet 过滤器
【发布时间】:2015-10-01 13:26:33
【问题描述】:

我正在创建一个 servlet 过滤器,它应该只处理对我的应用程序中特定路径的请求。

我可以很容易地为我的 ServletContextHandler 添加一个过滤器,例如:

FilterHolder holder = new FilterHolder(new MyFilter());
holder.setInitParameter("param", "a");
contextHandler.addFilter(holder, "/x", EnumSet.allOf(DispatcherType.class));

但是如何向此过滤器添加更多路径? 我希望它也能处理对/y 的请求。

我似乎找不到任何简单而正确的方法来做到这一点。 使用 web.xml,我只需在过滤器映射下定义多个 <url-pattern> 标签。

使用 Jetty 版本 9.3.0.v20150612。

【问题讨论】:

    标签: java servlets jetty servlet-filters embedded-jetty


    【解决方案1】:

    只需多次添加过滤器(通过其支架)。

    FilterHolder holder = new FilterHolder(new MyFilter());
    holder.setName("my-filter");
    holder.setInitParameter("param", "a");
    contextHandler.addFilter(holder, "/x", EnumSet.allOf(DispatcherType.class));
    contextHandler.addFilter(holder, "*.y", EnumSet.allOf(DispatcherType.class));
    contextHandler.addFilter(holder, "/z/*", EnumSet.allOf(DispatcherType.class));
    

    替代技术(重用从 addFilter 生成的持有人)

    Enum<DispatcherType> dispatchers = EnumSet.allOf(DispatcherType.class);
    FilterHolder holder = contextHandler.addFilter(MyFilter.class, "/x", dispatchers);
    holder.setInitParameter("param", "a");
    contextHandler.addFilter(holder, "*.y", dispatchers);
    contextHandler.addFilter(holder, "/z/*", dispatchers);
    

    【讨论】:

    • 我试过了,但是过滤器的init方法被调用了多次,这似乎是错误的。
    • 是的,您会看到多个“Filter.init()”调用。但每次调用都使用相同的“FilterConfig.getName()”和“FilterConfig.getServletContext()”。
    • 有什么方法可以体面地做到这一点吗?因为我有大约 50 个端点需要它,而大约 5 个不需要它……难道没有白名单机制而不是黑名单机制吗?
    • @ThomasStubbe 这应该是 stackoverflow 中的一个新问题。不,这是标准的 Servlet 机制。
    猜你喜欢
    • 2013-11-01
    • 1970-01-01
    • 2013-01-01
    • 2013-06-19
    • 2015-03-27
    • 2015-06-24
    • 2015-11-19
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多