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

Zee*_*mee 13 java servlets servlet-filters

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

Bal*_*usC 17

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

也可以看看:


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

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

    }

}
Run Code Online (Sandbox Code Playgroud)

在以下位置注册此侦听器web.xml:

<listener>
    <listener-class>com.example.Tomcat6FilterConfigurator</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

再次,请记住,这并没有对其他品牌/版容器的工作,甚至没有在Tomcat 7.0.

  • 链接中的解决方案非常好! (3认同)