2013-06-13 2 views
0

Я пытаюсь написать пользовательский перехватчик CXF, чтобы выполнить некоторые проверки запроса SOAP на веб-службу. Основываясь на результатах проверки, я хочу заблокировать запрос веб-службы и вернуть ответ с некоторыми измененными параметрами.CXF Custom Validation Interceptor с настраиваемым ответом не работает

Для этого я написал пользовательский CXF ininterceptor, простирающийся от AbstractPhaseInterceptor, для запуска в фазе USER_LOGICAL, который выполняет проверки, но я не могу остановить последующий вызов веб-службы, а также не смог передать объект Custom Response (Тип объекта Custom Response аналогичен типу возврата веб-службы). Как я могу это сделать с помощью перехватчиков?

ответ

0

Вы можете прервать выполнение interceptorChain в том числе с использованием веб-сервиса abort методы

public void handleMessage(SoapMessage message) { 

    InterceptorChain chain = message.getInterceptorChain(); 
    chain.abort(); 
} 
+0

Я попытался это, но он полностью останавливает перехватчик цепь без возврата ответа. Есть ли способ передать пользовательский ответ после остановки цепи перехватчика? – Sumit

+0

@Sumit: Я думаю, что вы можете напрямую манипулировать HttpServletResponse, получая ссылку из 'message.get (AbstractHttpDestination.HTTP_RESPONSE)' – nadirsaghar

0

Что-то вроде этого, нет необходимости играть с перехватчиком цепью.

public void handleMessage(Message message) { 
    //your logic 
    Response response = Response.status(Status.UNAUTHORIZED).type(MediaType.APPLICATION_JSON).build(); 
    message.getExchange().put(Response.class, response); 

} 
+0

Я только что проверил. Объект Response принадлежит пакету веб-сервисов RestFul. Будет ли он работать с SOAP-сервисом? – Sumit

+0

О, я пропустил эту часть .. не работал с SOAP, поэтому могу только догадываться, что в SOAP также должна быть аналогия для Response и вам нужно будет выяснить. – Sikorski

1

Я провел некоторое исследование на кончике от nadirsaghar, и я нашел, что это решение для очистки. Использование message.getExchange() в JAX-WS - полная боль, так как вам нужно настроить канал и заполнить ответное сообщение самостоятельно ...

Так лучше сделайте это, используя HttpServletResponse. - На вашем пути должен быть Java-сервлет-api.jar. Если вы разрабатываете без maven, просто связывайте его с каталогом веб-сервера (например, tomcat), но исключайте его из развертывания.

<!-- With Maven add the following dependency --> 
<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>servlet-api</artifactId> 
    <!-- The version should match your WebService version e.g. 3.0 for JDK7--> 
    <version>2.5</version> 
    <scope>provided</scope> 
</dependency> 

С объемом при условии, что не будет развернут и просто доступно, так что вы можете получить доступ к классу HttpServletResponse.

Ваш Handler Код:

@Override 
public void handleMessage(final Message message) throws Fault 
{ 
    if(shouldBlockMessage(message)) 
    { 
     message.getInterceptorChain().abort(); 

     final HttpServletResponse response = (HttpServletResponse)message.get(AbstractHTTPDestination.HTTP_RESPONSE); 

     // To redirect a user to a different Page 
     response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); 
     response.setHeader("Location", "http://www.bla.blubb/redirectPage"); 

     // Other possibility if a User provides faulty login data 
     response.setStatus(HttpServletResponse.SC_FORBIDDEN); 
    } 
}