不,不是通过标准的Servlet 2.5 API。这是在Servlet 3.0
中引入的。最好的选择是创建一个过滤器并自己重塑责任链模式。一种替代方法是从内部获取容器特定的类,然后通过其API添加过滤器。具体执行方式取决于目标容器(它还会使您的代码紧密耦合到有问题的容器)。
更新: 根据评论的要求,这是一个示例,
ServletContextListener说明如何在Webapp启动期间使用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。



