如何以编程方式添加 servlet 过滤器?
2022-09-03 14:31:58
虽然我看到了很多类似的问题,但我没有找到明确的答案。使用 Servlet Spec 2.5,是否可以以编程方式添加 Servlet 过滤器和映射?首选位置位于 Servlet.init() 或 ServletContextListener.contextInitialized() 中。
虽然我看到了很多类似的问题,但我没有找到明确的答案。使用 Servlet Spec 2.5,是否可以以编程方式添加 Servlet 过滤器和映射?首选位置位于 Servlet.init() 或 ServletContextListener.contextInitialized() 中。
不,不是通过标准的 Servlet 2.5 API。这是在 Servlet 3.0 中引入的。你最好的选择是创建一个过滤器,并自己重新发明责任链模式。另一种方法是从幕后抓取特定于容器的类,然后通过其 API 添加筛选器。具体如何做到这一点取决于目标容器(这也会使你的代码与相关容器紧密耦合)。
更新:根据评论的要求,这里有一个示例,说明如何使用Tomcat 6特定API在Webapp启动期间以编程方式添加过滤器:ServletContextListener
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。