我想将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
的实现
感谢您的问候:)
答案 0 :(得分:1)
我认为您不太了解SOAPMessage.writeTo
正在做什么(或对象流如何工作)。据我所知,writeTo
将为SOAPMessage
创建XML,并将其作为字节写入给定的流。要阅读它,请使用MessageFactory
及其createMessage
方法。写入流的信息不是对象(ObjectInputStream
期望的对象),而是数据。
要执行您想要的操作,请将ByteArrayOutputStream
包裹在CipherOutputStream
中(请参阅this question以查看如何使用密码流包装流)并改为调用sm.writeTo(cipherOutputStream)
。这将加密流上的字节,然后您可以将字节发送到您的Web服务。
让Web服务运行解密,方法是将ByteArrayInputStream
中收到的字节包装起来,然后将 包装在CipherInputStream
中。将生成的CipherInputStream
提供给MessageFactory
,它将重建原始的SOAPMessage。
不可否认,我不是Web服务方面的专家,因此我无法为您的特定解决方案提供代码,但这种方法肯定会为您提供加密的byte[]
发送,其中包含加密SOAPMessage
。
请注意,对象流无论如何都不会加密任何内容。您可能会这么认为,因为它的输出或多或少是不可读的,但它绝不是加密的。获得加密的唯一方法是使用加密。
一些参考资料:
MessageFactory
SOAPMessage.writeTo
CipherInputStream
和CipherOutputStream
Cipher
which is needed for cipher streams 希望这足以让你开始。