Джерсі ContainerRequestFilter не спрацьовує

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

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

@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"?>

  rest
     
    Jersey REST Service org.glassfish.jersey.servlet.ServletContainer  com.sun.jersey.spi.container.ContainerRequestFilters com.hck.debate.rest.security.AuthFilter   jersey.config.server.provider.packages com.hck.debate.rest.controller   com.sun.jersey.api.json.POJOMappingFeature true  1   
    
    Jersey REST Service  
    /*  
  
35

13 Відповіді

Гаразд, я не зрозумів, що параметр init для jersey.config.server.provider.packages має містити посилання не тільки на сервісні класи (кінцеві точки API), але й на всі класи, включаючи фільтри.

Тепер це працює:

  
  jersey.config.server.provider.packages  
  com.hck.debate.rest.controller;com.hck.debate.rest.security


    com.sun.jersey.spi.container.ContainerRequestFilters
    com.hck.debate.rest.security.AuthFilter

31
додано
Поведінка за умовчанням - це сканування рекурсивно, так що ви також можете просто використовувати єдиний базовий пакет com.hck.debate.rest
додано Автор Paul Samsotha, джерело
Також зауважте, що com.sun.jersey.spi.container.ContainerRequestFilters і com.sun.jersey.api.json.POJOMappingFeature є марними. Це властивості Джерсі 1.x. Вони не впливають на Джерсі 2.x
додано Автор Paul Samsotha, джерело
Ваш вище код працює так, як це відбувається з TomCat, може бути, він відрізняється від Glas Fish
додано Автор AZ_, джерело

Гаразд, я не зрозумів, що параметр init для jersey.config.server.provider.packages має містити посилання не тільки на сервісні класи (кінцеві точки API), але й на всі класи, включаючи фільтри.

Тепер це працює:

  
  jersey.config.server.provider.packages  
  com.hck.debate.rest.controller;com.hck.debate.rest.security


    com.sun.jersey.spi.container.ContainerRequestFilters
    com.hck.debate.rest.security.AuthFilter

31
додано
Поведінка за умовчанням - це сканування рекурсивно, так що ви також можете просто використовувати єдиний базовий пакет com.hck.debate.rest
додано Автор Paul Samsotha, джерело
Також зауважте, що com.sun.jersey.spi.container.ContainerRequestFilters і com.sun.jersey.api.json.POJOMappingFeature є марними. Це властивості Джерсі 1.x. Вони не впливають на Джерсі 2.x
додано Автор Paul Samsotha, джерело
Ваш вище код працює так, як це відбувається з TomCat, може бути, він відрізняється від Glas Fish
додано Автор AZ_, джерело

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

@Provider
public class MyAppFilter implements ContainerRequestFilter {
   //filter logic
}
21
додано
чи це "@Provider" дійсно необхідно?
додано Автор VedX, джерело
Той самий тут без анотації нічого не сталося
додано Автор Michael Laffargue, джерело
Так, мені просто довелося додати анотацію @Provider. Сканування пакета вже було правильно налаштовано
додано Автор ruediste, джерело

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

@Provider
public class MyAppFilter implements ContainerRequestFilter {
   //filter logic
}
21
додано
чи це "@Provider" дійсно необхідно?
додано Автор VedX, джерело
Той самий тут без анотації нічого не сталося
додано Автор Michael Laffargue, джерело
Так, мені просто довелося додати анотацію @Provider. Сканування пакета вже було правильно налаштовано
додано Автор ruediste, джерело

Деякі підказки:

  1. Make sure you're using JAX-RS version 2.17.
  2. Make sure you're using the right imports in your filter:

    • import javax.ws.rs.container.ContainerRequestContext;
    • import javax.ws.rs.container.ContainerRequestFilter;
  3. Add the @Provider annotation

5
додано
чи це "@Provider" дійсно необхідно?
додано Автор VedX, джерело
Так, він анотований компонент як постачальник чогось. Він використовується для розширення бази JAX-RS функціональності.
додано Автор ACV, джерело

У мене була така сама проблема для JAX-RS 2, джерсі, а нижня анотація була виправлена

 @PreMatching
2
додано
Але це змінює семантику! Додавання цього методу виключно впливає на , коли викликається фільтр. Я серйозно сумніваюся в тому, що це зміни конфігурації всього!
додано Автор GhostCat, джерело

Мінімальні вимоги до роботи фільтрів із трикотажем:

  • додайте анотацію @ Plider, щоб фільтрувати клас
  • простір імен класу фільтра повинен бути включений в "jersey.config.server.provider.packages" init-param

Інші налаштування не потрібні (наприклад, init-param або ResourceConfig 'com.sun.jersey.spi.container.ContainerRequestFilters')

2
додано
чи це "@Provider" дійсно необхідно?
додано Автор VedX, джерело
Так. Джерсі буде завантажувати лише позначені класи з вказаного простору імен
додано Автор crazyman, джерело

Замість того, щоб використовувати анотацію @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 Під час ініціалізації. Я помістив свій код між створенням і початком JettyHttpServer , з іншими матеріалами, які потрібно ініціалізувати під час запуску (Datasources, Resources, DAOs тощо).
додано Автор Pierre-Luc Pineault, джерело
і де цей код повинен бути розміщений?
додано Автор jon, джерело
Я зробив те ж саме, тепер я хочу закликати знищити (для деяких замовних завдань очищення) від сервлета. Я не можу отримати посилання на цей фільтр, щоб викликати знищення у випадку завершення роботи.
додано Автор Atul Kumar, джерело

Якщо ви застрягли, як і я, зверніть увагу, що TomEE 1.7.X використовує JAX-RS 1.1, який не включає ContainerRequestFilter.

0
додано

Замість javax.ws.rs я використав com.sun.jersey, і це працювало

import com.sun.jersey.spi.container.ContainerRequestFilter імпортувати com.sun.jersey.spi.container.ContainerRequest

Користувачі Dropwizard повинні це зробити

environment.jersey().getResourceConfig()
           .getContainerRequestFilters()
           .add(filter);
0
додано
І тим самим створюючи код, який покладається на пакети, на які не варто спиратися.
додано Автор GhostCat, джерело

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


   
     
   
   

0
додано

У нашому класі реалізації ResourceConfig нам не вистачало дзвінка нижче:

register(CorrelationIdFilter.class);
0
додано

У нашому класі реалізації ResourceConfig нам не вистачало дзвінка нижче:

register(CorrelationIdFilter.class);
0
додано