Преобразование входящего подписанного Base64-сообщения в исходное сообщение SOAP до достижения перехватчиков CXF, метод WS - PullRequest
0 голосов
/ 02 марта 2019

У меня есть wsdl, который содержит один сервис с множеством односторонних операций.Я использую CXF для обработки тяжелых условий работы и wsdl2java для генерации кода на стороне сервера JAX-WS.Я публикую свою конечную точку по пути "/ ip" .

Ситуация:

 1. SOAP message is signed with a custom certificate and encoded in base64 by
client
 2. receiving it on my side I have to unsign/verify/validate the base64-encoded message with a custom validation logic
 3. validation logic returns the original SOAP envelope
 4. SOAP envelope is routed to the proper WS-method by CXF

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

Не могли бы вы предложить решение для этого?

Код:

public class ValidatorInterceptor extends AbstractPhaseInterceptor<Message> {

    public ValidatorInterceptor() {
        super(Phase.RECEIVE);
        addBefore(WireTapIn.class.getName());
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        final boolean isInbound = message == message.getExchange().getInMessage();
        if (isInbound) {
            try {
                if (HuHttpHeaders.HEADER_SIGNING_ACCEPT_VALUE.equalsIgnoreCase((String) message.get(Message.ACCEPT_CONTENT_TYPE))) {
                    final CachedOutputStream cachedOutputStream = message.getContent(CachedOutputStream.class);
                    final byte[] signedMessage = IOUtils.readBytesFromStream(cachedOutputStream.getInputStream());
                    final String verificationResult = Validator.verify(signedMessage);
                    final byte[] soapMessageAsByte = verificationResult.getBytes(StandardCharsets.UTF_8);
                    cachedOutputStream.resetOut(null, false);
                    cachedOutputStream.write(soapMessageAsByte);
                    cachedOutputStream.flush();
                    message.setContent(CachedOutputStream.class, cachedOutputStream);

                    final LoadingByteArrayOutputStream loadingByteArrayOutputStream = new LoadingByteArrayOutputStream();
                    loadingByteArrayOutputStream.write(soapMessageAsByte);
                    message.setContent(InputStream.class, loadingByteArrayOutputStream.createInputStream());
                }
            } catch (IOException ioe) {
                throw new Fault(ioe);
            }
        }
    }
}
...