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

标签 java servlets servlet-filters

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

最佳答案

不,不是标准的 Servlet 2.5 API。这是 introduced在 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

    }

}

web.xml中注册这个监听器:

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

再一次记住,这对其他品牌/版本的容器有效,即使在 Tomcat 7.0 上也不行。

关于java - 如何以编程方式添加 servlet 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904577/

相关文章:

java - 删除 OneToMany 关系中的父级后为 "Cannot delete or update a parent row"

java - 使用 Maven 将一个 Java 程序添加为另一个程序的依赖项。

forms - 我可以在 jsp 中向两个不同的 Controller 添加两个提交按钮吗?

java - 升级hibernate导致eclipse maven项目中servlet-api-2.5.jar错误

grails - Grails是否允许使用过滤器进行声明式异常处理?

java - java.lang.IllegalArgumentException:无法从空字符串创建路径

Java Servlet if 语句不需要 { } 括号?

java - Webfilter 只能在第二个响应中登录用户(记住我)

java - 我们可以在 servlet-filter 的 url-mapping 中没有条件吗

java - 特殊类型的数据库关系