如何以编程方式添加 servlet 过滤器?

Posted

技术标签:

【中文标题】如何以编程方式添加 servlet 过滤器?【英文标题】:How can I add a servlet filter programmatically? 【发布时间】:2011-12-15 19:35:51 【问题描述】:

虽然我见过很多类似的问题,但我没有找到明确的答案。 使用 Servlet Spec 2.5,是否可以通过编程方式添加 servlet 过滤器和映射? 首选位置在 Servlet.init() 或 ServletContextListener.contextInitialized() 中。

【问题讨论】:

【参考方案1】:

不,不是通过标准 Servlet 2.5 API。这是 Servlet 3.0 中的 introduced。您最好的选择是创建一个过滤器并自己重新发明责任链模式。另一种方法是从底层获取容器特定的类,然后通过其 API 添加过滤器。具体如何做到这一点取决于目标容器(它还会使您的代码与相关容器紧密耦合)。

另见:

How to add filters to servlet without modifying web.xml

更新:根据评论的要求,这里有一个 ServletContextListener 风格的示例,您可以如何在 web 应用程序启动期间使用 Tomcat 6 特定 API 以编程方式添加过滤器:

package com.example;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.catalina.Container;
import org.apache.catalina.ServerFactory;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.deploy.FilterDef;
import org.apache.catalina.deploy.FilterMap;

public class Tomcat6FilterConfigurator implements ServletContextListener 

    @Override
    public void contextInitialized(ServletContextEvent event) 
        StandardEngine engine = (StandardEngine) ServerFactory.getServer().findService("Catalina").getContainer();
        Container container = engine.findChild(engine.getDefaultHost());
        StandardContext context = (StandardContext) container.findChild(event.getServletContext().getContextPath());

        FilterDef filter1definition = new FilterDef();
        filter1definition.setFilterName(Filter1.class.getSimpleName());
        filter1definition.setFilterClass(Filter1.class.getName());
        context.addFilterDef(filter1definition);

        FilterMap filter1mapping = new FilterMap();
        filter1mapping.setFilterName(Filter1.class.getSimpleName());
        filter1mapping.addURLPattern("/*");
        context.addFilterMap(filter1mapping);

        // ...
    

    @Override
    public void contextDestroyed(ServletContextEvent event) 
        // TODO Auto-generated method stub

    


web.xml注册这个监听器如下:

<listener>
    <listener-class>com.example.Tomcat6FilterConfigurator</listener-class>
</listener>

再一次请记住,这适用于其他品牌/版本的容器,甚至不适用于 Tomcat 7.0。

【讨论】:

链接中的解决方案很贴心! @BalusC - 谢谢你的明确回答。我之前在链接线程上阅读了您的答案,但这不是我们想要的。您能否给我一个在 Tomcat 6.0 上“抓取容器特定类”以实现我想要的入口点?

以上是关于如何以编程方式添加 servlet 过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

在 servlet 中以编程方式调用过滤器(使用码头/火花创建)?

如何以编程/动态方式将组件添加到 p:dataTable facet

WCF路由如何以编程方式添加备份列表

Drupal 7:以编程方式将过滤器添加到视图中

如何以编程方式配置过滤器链?

以编程方式为 JFileChooser 设置文件过滤器