Хотя я видел много подобных вопросов, я не нашел ясного ответа. Используя Servlet Spec 2.5, можно ли программным образом добавлять фильтры сервлетов и сопоставления? Предпочтительное расположение будет в Servlet.init() или в ServletContextListener.contextInitialized().
Как я могу добавить сервлет-фильтр программно?
Ответ 1
Нет, не стандартным API Servlet 2.5. Это было представленное в Servlet 3.0. Лучше всего создать отдельный фильтр и заново создать цепочку ответственности. Альтернативой является захват контейнеров конкретных классов из-под обложки, а затем добавить фильтр по его API. Как это сделать, это зависит от целевого контейнера (и это также сделает ваш код жестко связанным с рассматриваемым контейнером).
См. также:
Обновление: в соответствии с запросом комментария, вот пример в аромате ServletContextListener
, как вы могли бы добавлять фильтры программно во время запуска webapp с использованием специфических 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>
Еще раз помните, что это делает не работу с контейнерами другой make/версии, даже не на Tomcat 7.0.