Как получить согласованные ресурсы запроса в ContainerRequestFilter
Я работаю над WebService, используя JAX-RS/Jersey.
Я установил ContainerRequestFilter, целью которого является аутентификация пользователя. Мне нужно только защитить некоторые пути с помощью аутентификации, остальные могут быть доступны для всех.
Я хочу получить matchedResources/matchedResults через ExtendedUriInfo в моем ContainerRequestFilter, чтобы я мог проверить, должен ли путь быть защищен или нет. Есть ли способ создать фильтр, который вызывается после заполнения ExtendedUriInfo, но до того, как вызывается соответствующий класс и метод ресурса?
Ответы
Ответ 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 через его конструктор.