Как программно добавить фильтр сервлета?

Хотя я видел много подобных вопросов, я не нашел четкого ответа. Можно ли с помощью Servlet Spec 2.5 программно добавлять фильтры и сопоставления сервлетов? Предпочтительным местом будет Servlet.init() или ServletContextListener.contextInitialized().


person Zeemee    schedule 26.10.2011    source источник


Ответы (1)


Нет, не с помощью стандартного API Servlet 2.5. Это было появился в Servlet 3.0. Лучше всего создать единый фильтр и самостоятельно заново изобрести шаблон цепочки ответственности. Альтернативой является получение конкретных классов контейнера из-под обложки, а затем добавление фильтра с помощью его API. Как именно это сделать, зависит от целевого контейнера (и это также сделает ваш код тесно связанным с рассматриваемым контейнером).

Смотрите также:


Обновление: согласно запросу комментария, вот пример в виде ServletContextListener того, как вы можете программно добавлять фильтры во время запуска веб-приложения, используя специальные API Tomcat 6:

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.

person BalusC    schedule 26.10.2011
comment
Решение по ссылке довольно милое! - person MarianP; 26.10.2011
comment
@BalusC - Спасибо за четкий ответ. Я читал ваш ответ в связанной ветке раньше, но это не то, что мы собираемся. Не могли бы вы дать мне точку входа для захвата конкретных классов контейнера в Tomcat 6.0 для достижения того, что я хочу? - person Zeemee; 27.10.2011