ContainerRequestFilter JBoss AS 7.1.1 RestEasy 3.0.6. Финал

1

Я пытаюсь настроить фильтр запросов, потому что я хотел бы проверить некоторые данные заголовка HTTP, прежде чем вызывать свою логику. К сожалению, мой фильтр никогда не вызывается в JBoss AS7.1.1. Я уже пытался обновить реализацию RestEasy (модуль) до 3.0.6, как описано в документации RestEasy. В нем говорится, что вам просто нужно заменить каталоги, предоставленные новым zip файлом реализации, и я сделал это. AS начал без каких-либо ошибок, но поведение никоим образом не изменилось. Каждый запрос остается неперехваченным. Я извлек этот код из более сложного примера, но даже эта простая вещь не работает:

Filter.java

import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;

@Provider
@Secured
public class SecurityFilter implements ContainerRequestFilter {

public void filter(ContainerRequestContext crc) throws IOException {
    throw new IllegalStateException("Not in my house");
}
}

ItemsResource.java

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

@Path("/Items")
public class ItemsResource {

@GET
@Produces("application/json")
@Secured
public String getJson() {
    return "{\"id:\" \"1\"}";
}
}

ApplicationConfig.java

@javax.ws.rs.ApplicationPath("rest")
public class ApplicationConfig extends Application {    
}

Secured.java

import javax.ws.rs.NameBinding;

@NameBinding
public @interface Secured {}

Я ничего не меняю, если попытаюсь использовать перехватчик и ресурс без аннотации. Я ожидаю, что все запросы будут перехвачены, но не будут. У меня нет клея, что делать. Может кто-нибудь помочь нам с некоторыми советами? Позвольте добавить дополнительную вещь. Я пробовал то же самое с Wildfly (JBoss 8.0.0 Final). Перехват с помощью @NameBinding и применение пользовательской аннотации тоже не работает, но если я не использую аннотацию и просто комментирую перехватчик с @Provider, весь мой запрос будет перехвачен. Должен ли я перейти на Wildfly или что?

Теги:
rest
interceptor
jboss
resteasy

4 ответа

3

У нас была одна и та же проблема. Мы использовали 3.0.8.Наконечную версию RESTeasy с зависимостями POM.
Также обновить модули JBOSS (ЕАР 6,1) с содержанием архива resteasy-jaxrs-3.0.7.Final.
Единственным отличием является то, что в фильтре мы используем:

@Provider @PreMatching
@Precedence("SECURITY")
public class SecurityInterceptor implements ContainerRequestFilter{
@Override
public void filter(ContainerRequestContext arg0) throws IOException {
    ...
    }
}

Кроме того, нам также необходимо зарегистрировать вручную Провайдеров в web.xml с помощью:

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.neology.rest.SecurityInterceptor</param-value>
</context-param>

Другая проблема в том, что мы застряли, была связана с интеграцией Spring.
Во-первых, проверьте порядок * Слушателей

<!-- RESTeasy Listener 1st -->
<listener>
    <listener-class>
    org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
    </listener-class>
</listener>
<!-- Spring Listener 2nd -->
<listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>


Также проверьте свою цепочку фильтров безопасности. Если вы настроили отображение сервлета вашего отдыха как-то наподобие /rest/* вам нужно сделать Spring, чтобы не фильтровать службу REST. Мы используем это в конфигурации Spring xml:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<mvc:resources mapping="/rest/**" location="/rest/" /> 

Надеюсь это поможет!

  • 0
    Спасибо! Помог мне настроить ContainerRequestFilter с помощью JBoss AS 7.1.1. После обновления RestEASY до версии 3.0.5 все заработало. Сначала я безуспешно пытался обновить RestEASY до версии 3.6.3.
1

Вы можете использовать Restrease PreProcessInterceptor:

import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.spi.interception.PreProcessInterceptor;
import javax.ws.rs.ext.Provider;

@Provider
@ServerInterceptor
public class SecurityInterceptor implements PreProcessInterceptor {

    @Override
    public ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException {
        if (/* Check if a user is currently authenticated */) {
            // no current authenticated user: throw exception
            throw new NotAuthenticatedException();
        }
        return null; // = continue without interrupting
    }
}
  • 4
    PreProcessInterceptor устарел
0

Добавьте файл поставщика под вашими услугами META-INF/, например: /META-INF/services/javax.ws.rs.ext.Providers, javax.ws.rs.ext.Providers - это файл, контент - это ваш путь фильтр: com.hujiang.foe.instalment.liquidation.biz.impl.account.filter.ContextCleanFilter

0

Ваша проблема уже упоминалась: Фильтр соответствия с определенным методом через NameBinding на RESTeasy

вам необходимо удалить @PreMatching и убедиться, что сохраненная аннотация сохраняется во время выполнения (Retention = RUNTIME).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню