2

我想将 SOAPMessage 转换为字节数组,这样我就可以对其进行加密,然后在代理服务器中对其进行解密,该代理服务器将代表我调用 Web 服务。问题是 SOAPMessage 没有实现java.io.Serializable,因此我无法继续对其进行加密。

我用它来序列化

public static byte[] serializeSoapMessage (SOAPMessage sm){
    try {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        sm.writeTo(baos);
       byte[] bytes= baos.toByteArray();
       return bytes;
    } catch (SOAPException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

但是反序列化是一个问题,因为ObjectInputStream需要实现java.io.Serializable

谢谢你的问候:)

4

1 回答 1

1

我认为您不太了解SOAPMessage.writeTo正在做什么(或对象流如何工作)。据我所知,writeTo将为它创建 XMLSOAPMessage并将其作为字节写入给定的流中。要阅读它,请使用 aMessageFactory及其createMessage方法。写入流的信息不是对象(这是ObjectInputStream预期的),而是数据。

要执行您想要的操作,请将您的包装ByteArrayOutputStream在 a 中CipherOutputStream(请参阅此问题以了解如何用密码流包装流)并sm.writeTo(cipherOutputStream)改为调用。这将加密流上的字节,然后您可以将字节发送到您的 Web 服务。

让 Web 服务通过将接收到的字节包装在 a 中ByteArrayInputStream然后将包装在 a中来运行解密CipherInputStream。将结果CipherInputStream提供给MessageFactory,它将重建原始 SOAPMessage。

诚然,我不是 Web 服务方面的专家,因此我无法为您提供特定解决方案的工作代码,但这种方法肯定会为您提供加密byte[]发送,其中包含已加密的SOAPMessage.

请注意,对象流无论如何都不会加密任何东西。您可能会这样认为,因为它的输出或多或少不可读,但它绝不是加密的。获得加密的唯一方法是使用加密。

给你一些参考:

希望这足以让你开始。

于 2012-10-13T02:41:14.823 回答