Я обнаружил, что Sling может связывать сервлеты с определенными типами ресурсов, селекторами и расширениями, методами. действительно полезно при разработке компонентов.

Теперь я начинаю изучать ComponentFilterChain и хочу создать фильтры, которые регистрируются только для определенных типов ресурсов, точно так же, как сервлеты выше.

Из Примеры фильтров в проекте Sling, я вижу, что есть свойство pattern, которое вы можете применить для определенных путей, хотя кажется, что это ограничивает преимущества наличия компонентов .

На самом деле я ищу свойство, эквивалентное sling.servlet.resourceType, с помощью которого я могу аннотировать свой фильтр, чтобы только определенные компоненты входили в этот фильтр как часть цепочки фильтров компонентов, вместо того, чтобы проверять компонент resourceType / superResourceType в фильтре.

Возможно ли это с фильтрами Sling? Или можно использовать эквивалентный подход?

2
anotherdave 2 Июн 2013 в 23:04

2 ответа

Лучший ответ

По умолчанию нет способа связать фильтры сервлетов с типами ресурсов Sling. Составление служб OSGi, возможно, с использованием значений sling: resourceType, установленных в качестве свойств службы, должно позволить вам предоставлять аналогичные функции.

3
Bertrand Delacretaz 3 Июн 2013 в 13:02
Спасибо, Бертран. Вы имеете в виду передачу sling:resourceType фильтру через аннотацию свойства и решение работать с запросом или пропустить его на основе этого из фильтра?
 – 
anotherdave
4 Июн 2013 в 00:47
Я имею в виду создание сервисов OSGi со свойствами сервиса (аннотациями @Property), аналогичными тем, что используют Sling Servlets. Затем вы можете получить такие службы через BundleContext.getServiceReferences (java.lang.Class clazz, java.lang.String serviceFilter), где serviceFilter - это фильтр, подобный LDAP, который позволяет вам выбирать службы на основе этих свойств.
 – 
Bertrand Delacretaz
4 Июн 2013 в 11:38

Начиная с Apache Sling 2.6.14, есть возможность связать фильтры Sling с типами ресурсов.

Для этого вам нужно добавить в службу OSGi свойство sling.filter.resourceTypes.

Доступен набор аннотаций, упрощающих работу. .

Из документации Sling.

   //...
   import org.apache.sling.servlets.annotations.SlingServletFilter;
   import org.apache.sling.servlets.annotations.SlingServletFilterScope;
   import org.osgi.service.component.annotations.Component;

   @Component
   @SlingServletFilter(scope = {SlingServletFilterScope.REQUEST},
                       suffix_pattern = "/suffix/foo",
                       resourceTypes = {"foo/bar"},
                       pattern = "/content/.*",
                       extensions = {"txt","json"},
                       selectors = {"foo","bar"},
                       methods = {"GET","HEAD"})
   public class FooBarFilter implements Filter {

       // ... implementation
   }
0
toniedzwiedz 9 Сен 2022 в 16:45