Перехватить конечную точку веб-службы Spring и расшифровать ее - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть весенний веб-сервис, например,

@Endpoint
public class ServiceEndpoint {

    private final RequestProcessingService requestProcessingService;
    private final String NAMESPACE = "http://example.com/schemas";

    @Autowired
    public ServiceEndpoint(RequestProcessingService requestProcessingService) {
        this.requestProcessingService = requestProcessingService;
    }

    @ResponsePayload
    @PayloadRoot(namespace = NAMESPACE, localPart = "ServiceInfoRequest")
    public ServiceInfoResponse handleService(@RequestPayload String serviceInfoRequest) {
        //Business Logic here
    }
}

Полезная нагрузка запроса выглядит следующим образом:

@XmlRootElement(name = "ServiceInfoRequest", namespace = NAMESPACE)
@XmlAccessorType(XmlAccessType.FIELD)
public class ServiceInfoRequestBase implements Serializable {

    private static final long serialVersionUID = 1L;

    private String amount;

    private String username;

    private String serviceCode;

}

Я получаю запрос от клиента в зашифрованном виде (данные) и вместе с этим я получаю подпись и секретный ключ. Мне нужно расшифровать данные в вышеупомянутом DTO, прежде чем он достигнет конечной точки. Я сделал следующее:

@Override
    public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
        LOG.info("Endpoint Request Handling");
        SaajSoapMessage saajSoapMessage = (SaajSoapMessage) messageContext
                .getRequest();
        SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
        SOAPBody soapBody = soapMessage.getSOAPBody();
        DOMSource source = new DOMSource(soapBody);
        StringWriter stringResult = new StringWriter();
        TransformerFactory.newInstance().newTransformer().transform(source, new StreamResult(stringResult));
        String message = stringResult.toString();
        //TODO: decrypt and change soap request
        return true;
    }

Но я не совсем понимаю, как изменить запрос soap, чтобы изменить его на ServiceInfoRequest для конечной точки. Клиент будет отправлять запрос как

<xml>
  <data>enc data</data>
  <signature> sign </data>
  <secret_key> key </secret_key> 
</xml>
...