2013-12-01 3 views
1

Я разрабатываю приложение WCMS для Apache Sling. Мне нужно отфильтровать все запросы, отправленные на сервер, и установить некоторые заголовки в объекте ответа. Я реализовал класс активатора фильтра и пучка в соответствии с Felix Http Filter Sample и был установлен как комплект для стропы.Ошибка фильтра Apache Felix

Fileter класс:

import javax.servlet.*; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

public class HeaderFilter implements Filter { 
    private final String name; 

    public HeaderFilter(String name) { 
     this.name = name; 
    } 

    public void init(FilterConfig config) throws ServletException { 
     doLog("Init with config [" + config + "]"); 
    } 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
      throws IOException, ServletException { 
     try { 
      HttpServletResponse response = (HttpServletResponse) res; 
      HttpServletRequest request = (HttpServletRequest) req; 
      doLog("Filter request [" + request + "]"); 
      response.setHeader("Cache-Control", "no-cache"); 
      response.setHeader("Expires", "-1"); 
      chain.doFilter(req, response); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void destroy() { 
     doLog("Destroyed filter"); 
    } 

    private void doLog(String message) { 
     System.out.println("## [" + this.name + "] " + message); 
    } 
} 

Bundle Активатор класс:

import org.apache.felix.http.api.ExtHttpService; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceReference; 
import org.osgi.util.tracker.ServiceTracker; 

import java.util.Dictionary; 
import java.util.Hashtable; 

public class Activator implements BundleActivator { 
    private ServiceTracker tracker; 
    private HeaderFilter filter1 = new HeaderFilter("filter1"); 
    Dictionary hashTable = new Hashtable<Object, Object>(); 

    public void start(BundleContext context) throws Exception { 
     try { 
      this.tracker = new ServiceTracker(context, ExtHttpService.class.getName(), null) { 
       @Override 
       public Object addingService(ServiceReference ref) { 
        Object service = super.addingService(ref); 
        serviceAdded((ExtHttpService) service); 
        return service; 
       } 

       @Override 
       public void removedService(ServiceReference ref, Object service) { 
        serviceRemoved((ExtHttpService) service); 
        super.removedService(ref, service); 
       } 
      }; 

      this.tracker.open(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void stop(BundleContext context) 
      throws Exception { 
     this.tracker.close(); 
    } 

    private void serviceAdded(ExtHttpService service) { 
     try { 
      hashTable.put("filter.scope", new String[]{"request", "forward", "include"}); 
      service.registerFilter(this.filter1, ".*", hashTable, 0, null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void serviceRemoved(ExtHttpService service) { 
     service.unregisterFilter(this.filter1); 
    } 
} 

проблема с приведенным выше кодом. Он не работает, и запрос не будет отфильтрован.

Любая помощь приветствуется заранее.

ответ

0

я обнаружил, что мой фильтр не отслеживается с помощью трекера службы, поэтому, передавая параметр «истинный» в tracker.open() фильтр отслеживали:

this.tracker.open(true); 
2

Обратите внимание, что вы можете реализовать это в гораздо проще, используя Sling Filters, реализованные как декларативные службы OSGi (DSA).

Вам понадобятся только несколько аннотаций в вашем фильтре, без активатора и правильная настройка pom.xml для плагинов Maven, которые обрабатывают аннотации DS.

Документация находится на https://sling.apache.org/documentation/the-sling-engine/filters.html, и она указывает на пример NoPropertyFilter из тестов интеграции Sling.

+0

Спасибо. Не могли бы вы сказать, что случилось с активатором? Использование аннотаций вместо класса активатора имеет особые преимущества? Есть ли специальный стандарт для объявления таких услуг? –

+1

Нет ничего плохого в использовании активатора, но это намного больше кода, большая часть которого является шаблоном. Декларативные службы также будут обрабатывать зависимости между службами автоматически, что в вашем случае вам нужно делать вручную. Специального стандарта для объявления таких услуг нет, описанный выше пример NoPropertyFilter типичен. –

Смежные вопросы