Определить целевой сервис / метод из CXF Interceptor - PullRequest
5 голосов
/ 18 ноября 2010

Я хотел бы написать перехватчик для реализации Apache CXF JAX-RS, который проверяет целевой сервис / метод для конкретной аннотации и выполняет некоторую специальную обработку для этой аннотации.

Не могу показатьсянайти что-нибудь в документации перехватчика, которая описывает, как это сделать.У кого-нибудь есть идеи?

Спасибо!

Ответы [ 4 ]

9 голосов
/ 20 ноября 2010

Если перехватчик работает довольно поздно в цепочке (например, USER_LOGICAL фаза), вы должны быть в состоянии сделать что-то вроде:


Exchange exchange = msg.getExchange();
BindingOperationInfo bop = exchange.get(BindingOperationInfo.class);
MethodDispatcher md = (MethodDispatcher) 
                exchange.get(Service.class).get(MethodDispatcher.class.getName());
Method meth = md.getMethod(bop);

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

4 голосов
/ 20 января 2011

Ах.Я не уточнил, что я использую JAX-RS часть CXF;не уверен, повлияет ли это на ответ Дэниела Кулпа, но его решение на самом деле не работает для меня.Я полагаю, это потому, что CXF работает по-разному при обработке JAX-RS.

Я наткнулся на исходный код CXF [JAXRSInInterceptor][1], и в этом коде я увидел, что этот перехватчик помещает информацию о методе в Exchangeобъект, подобный так:

message.getExchange().put(OperationResourceInfo.class, ori);

... во время фазы UNMARSHAL, что в соответствии с документами CXF перехватчика происходит до фазы *_LOGICAL.Поэтому, написав Interceptor, который обрабатывает фазу USER_LOGICAL, я могу сделать:

message.getExchange().get(OperationResourceInfo.class)

... чтобы получить доступ к Method и Class<?>Service обработки вызова!

1 голос
/ 12 октября 2013

Это довольно давно с момента принятия ответа. Но в

представлено несколько вспомогательных абстракций.
cxf-rt-core-2.7.3.jar

Один в этом org.apache.cxf.interceptor.security.AbstractAuthorizingInInterceptor

Примерная выдержка из источника может быть хорошей ссылкой.

protected Method getTargetMethod(Message m) {
    BindingOperationInfo bop = m.getExchange().get(BindingOperationInfo.class);
    if (bop != null) {
        MethodDispatcher md = (MethodDispatcher) 
            m.getExchange().get(Service.class).get(MethodDispatcher.class.getName());
        return md.getMethod(bop);
    } 
    Method method = (Method)m.get("org.apache.cxf.resource.method");
    if (method != null) {
        return method;
    }
    throw new AccessDeniedException("Method is not available : Unauthorized");
}
0 голосов
/ 23 декабря 2014

Исходя из первоначального ответа следователя, я придумал это

public UserContextInterceptor() {
    super(Phase.USER_LOGICAL);
}

@Override
public void handleMessage(Message message) {
    if(StringUtils.isEmpty(getHeader("some-header-name", message))) {
        final Method method = getTargetMethod(message);
        if(isAnnotated(method.getDeclaringClass().getAnnotations()) || isAnnotated(method.getAnnotations())) {
            final Fault fault = new Fault(new LoginException("Missing user id"));
            fault.setStatusCode(HttpServletResponse.SC_UNAUTHORIZED);
            throw fault;
        }
    }
}

private static Method getTargetMethod(Message message) {
    final Exchange exchange = message.getExchange();
    final OperationResourceInfo resource = exchange.get(OperationResourceInfo.class);
    if(resource == null || resource.getMethodToInvoke() == null) {
        throw new AccessDeniedException("Method is not available");
    }
    return resource.getMethodToInvoke();
}

private static boolean isAnnotated(Annotation[] annotations) {
    for(Annotation annotation : annotations) {
        if(UserRequired.class.equals(annotation.annotationType())) {
            return true;
        }
    }
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...