我想将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
谢谢您的问候:)
最佳答案
我认为您不太了解SOAPMessage.writeTo
在做什么(或对象流如何工作)。据我所知,writeTo
将为SOAPMessage
创建XML并将其作为字节写入到给定的流中。要读取它,请使用MessageFactory
及其createMessage
方法。写入流的信息不是对象(ObjectInputStream
期望的),而是数据。
要执行您想要的操作,请将您的ByteArrayOutputStream
包装在CipherOutputStream
中(请参阅this question,以了解如何使用密码流包装流)并改为调用sm.writeTo(cipherOutputStream)
。这将加密流中的字节,然后您可以将字节发送到Web服务。
通过将接收到的字节包装在ByteArrayInputStream
中,然后将其包装在CipherInputStream
中,使Web服务运行解密。将结果CipherInputStream
赋予MessageFactory
,它将重建原始的SOAPMessage。
诚然,我不是Web服务方面的专家,所以我不能为您提供特定解决方案的工作代码,但是这种方法肯定会给您发送加密的byte[]
,其中包含加密的SOAPMessage
。
请注意,对象流始终不会加密任何内容。您可能会这样认为,因为其输出或多或少不可读,但绝不是加密的。获得加密的唯一方法就是使用加密。
为您提供一些参考:
Wrapping streams with cipher streamsMessageFactory
SOAPMessage.writeTo
CipherInputStream
和CipherOutputStream
Lesson on cipher streams
Lesson on Cipher
which is needed for cipher streams
希望这足以让您入门。