Подтвердить что ты не робот

Как получить согласованные ресурсы запроса в ContainerRequestFilter

Я работаю над WebService, используя JAX-RS/Jersey.

Я установил ContainerRequestFilter, целью которого является аутентификация пользователя. Мне нужно только защитить некоторые пути с помощью аутентификации, остальные могут быть доступны для всех.

Я хочу получить matchedResources/matchedResults через ExtendedUriInfo в моем ContainerRequestFilter, чтобы я мог проверить, должен ли путь быть защищен или нет. Есть ли способ создать фильтр, который вызывается после заполнения ExtendedUriInfo, но до того, как вызывается соответствующий класс и метод ресурса?

4b9b3361

Ответ 1

Вот более общий ответ (например, если вы используете другую реализацию jax-rs, такую ​​как CXF):

Просто добавьте следующее в свой класс фильтра как переменную экземпляра:

@Context

Информация о ресурсе;

"javax.ws.rs.container.ResourceInfo - это новый контекст JAX-RS, который может впрыскиваться в фильтры и перехватчики и проверять, какой ресурс класс и метод будут вызваны."

(источник: https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Basics#JAX-RSBasics-ResourceInfo)

Оригинальный ответ здесь

Ответ 2

Найден способ сделать это с помощью ContainerRequestFilter:

public void filter(ContainerRequestContext requestContext) {
    UriRoutingContext routingContext = (UriRoutingContext) requestContext.getUriInfo();
    ResourceMethodInvoker invoker = (ResourceMethodInvoker) routingContext.getInflector();
    Class<?> className = invoker.getResourceClass();
    Method methodName = invoker.getResourceMethod();
}

Ответ 3

Мне удалось это понять.

Подход, который я нашел для работы, заключается в том, чтобы отказаться от этого в ContainerRequestFilter и создать ResourceFilterFactory. В ResourceFilterFactory я могу использовать

AbstractMethod.isAnnotationPresent(clazz)

чтобы определить, присутствует ли моя пользовательская аннотация. Если моя аннотация присутствует, я могу затем вернуть список, содержащий мой AuthenticationContainerRequestFilter.

Еще один совет для любого, кто читает этот ответ, заключается в том, что инъекция в ContainerRequestFilter не будет работать при использовании подхода ResourceFilterFactory. То, что я сделал, это сделать любую инъекцию в ResourceFilterFactory, а затем передать введенные объекты в ContainerRequestFilter через его конструктор.