2013-06-25 6 views
34

Я пытаюсь использовать ContainerRequestFilter для обеспечения некоторой аутентификации на основе приложения на основе Tomcat. Я следовал this document. Проблема: фильтр никогда не срабатываетJersey ContainerRequestFilter не активирован

Класс фильтра:

@Provider 
public class AuthFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) 
     throws IOException { 

     // MY AUTHENTICATION CODE GOES HERE 

    } 

Файл web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="debate-rest" 
    version="3.0"> 
    <display-name>rest</display-name> 
    <servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
     <param-value>com.hck.debate.rest.security.AuthFilter</param-value> 
    </init-param> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.hck.debate.rest.controller</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param>  
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

ответ

29

Хорошо, я не получил, что jersey.config.server.provider.packages INIT парам необходимо ссылаются не только на классы обслуживания (конечные точки API), но и на ВСЕ классы, включая фильтры.

Сейчас он работает:

<init-param> 
    <param-name>jersey.config.server.provider.packages</param-name> 
    <param-value>com.hck.debate.rest.controller;com.hck.debate.rest.security</param-value> 
</init-param> 
<init-param> 
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
    <param-value>com.hck.debate.rest.security.AuthFilter</param-value> 
</init-param> 
+0

Ваш выше код работает, как это с TomCat, может быть, по-другому с Glas рыбы –

+0

поведение по умолчанию для сканирования рекурсивно, так что вы можете просто использовать единый базовый пакет ' com.hck.debate.rest' –

+3

Также обратите внимание, что 'com.sun.jersey.spi.container.ContainerRequestFilters' и' com.sun.jersey.api.json.POJOMappingFeature' бесполезны. Это свойства Джерси 1.x. Они не влияют на Джерси 2.x –

21

Я также должен был добавить аннотацию @Provider JAX-RS для моих фильтров.
Это позволяет обнаружить фильтр во время фазы сканирования JAX-RS.

@Provider 
public class MyAppFilter implements ContainerRequestFilter { 
    // filter logic 
} 
+2

То же здесь без аннотации ничего не произошло –

+0

действительно ли это «@Provider»? – VedX

+0

Да, мне просто пришлось добавить аннотацию @Provider. Сканирование пакетов уже настроено правильно – ruediste

2

Минимальные требования к работе фильтров с футболкой:

  • добавить @Provider аннотации фильтровать класс
  • пространства имен класса фильтра должны быть включены в «jersey.config.server.provider .packages' INIT-пары

Любые другие настройки не требуется (например, '' com.sun.jersey.spi.container.ContainerRequestFilters INIT-пары или ResourceConfig)

+0

Действительно ли это «@Provider»? – VedX

+0

есть, есть. Джерси будет загружать только отмеченные классы из указанного пространства имен – crazyman

2

У меня была такая же проблема для JAX-RS 2, джерси и ниже аннотаций фик его

@PreMatching 
5

Некоторые намеки:

  1. Убедитесь, что вы используете JAX-RS версии 2,17.
  2. Убедитесь, что вы используете правильный импорт в фильтре:

    • import javax.ws.rs.container.ContainerRequestContext;
    • import javax.ws.rs.container.ContainerRequestFilter;
  3. Добавить @Provider аннотацию

+0

действительно ли это «@Provider»? – VedX

+0

Да, он комментирует компонент как поставщика чего-то. Он используется для расширения базовой функциональности JAX-RS. – ACV

0

Вместо того, чтобы с помощью @Provider аннотация (Который не работает в моем случае), вы можете зарегистрировать ваш ContainerRequestFilter вручную с вашим JerseyServletFactory:

JerseyServletFactory jerseyServletFactory = new JerseyServletFactory(config); 
HttpServlet myServiceServlet = jerseyServletFactory.create(myResource); 

// Register your ContainerRequestFilter like this 
jerseyServletFactory.addRequestFilter(new MyFilter()); 

httpServer.register(myServiceServlet, "/api"); 
httpServer.start(); 
+0

и где этот кусок кода должен быть помещен? – jon

+0

@jon Во время инициализации. Я размещаю свой код между созданием и запуском «JettyHttpServer», с другим материалом, который нужно инициализировать при запуске (источники данных, ресурсы, DAO и т. Д.). –

+0

Я сделал то же самое, теперь я хочу позвонить уничтожить (для какой-либо пользовательской задачи очистки) сервлета. Я не могу получить ссылку назад этого фильтра, чтобы вызвать destroy в событии shutdown. – Atul

0

Вместо javax.ws.rs, я использовал com.sun.Джерси и работал

пользователи

import com.sun.jersey.spi.container.ContainerRequestFilter import com.sun.jersey.spi.container.ContainerRequest

Dropwizard нужно сделать это

environment.jersey().getResourceConfig() 
      .getContainerRequestFilters() 
      .add(filter); 
0

Если вы застряли, как я, обратите внимание, что TomEE 1.7.x использует JAX-RS 1.1, который не включает в себя ContainerRequestFilter ,

0

Для всех, у кого есть эта проблема в MULE ESB. Не забудьте зарегистрировать путь с:

<jersey:resources doc:name="REST"> 
    <component doc:name="rest component"> 
    <spring-object bean="endpoit"/> 
    </component> 
    <jersey:package packageName="path @Provider-s"/> 
</jersey:resources >