У меня есть 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);
}
}
}
}