如何限制从Socket通过ObjectInputStream读取的最大大小?

有没有办法限制从java中的ObjectInputStream读取的最大缓冲区大小?

如果很明显有问题的对象是恶意巨大的,那么我想停止反序列化。

当然,有ObjectInputStream.read(byte [] buf,int off,int len),但我不想受到分配的性能损失,比如byte [1000000]。

我在这里错过了什么吗?

您编写了一个FilterInputStream ,如果它发现它已从其基础流中读取了超过一定数量的数据,则会抛出exception。

我可以看到两种方式:
1)循环读取,抓取你喜欢的分配大小的块,当你达到极限时退出并停止; 或者2)分配一次最大大小的缓冲区并重新使用它进行后续读取。

实际上,这是一个非常简单的方法。

您可以使用NIO的ByteBuffer,并使用allocateDirect方法。 此方法将允许您分配内存映射文件,因此它没有巨大的开销,您可以限制其大小。

然后,不是从套接字获取流,而是获取Channel。

码:

  Socket s; ByteBuffer buffer = ByteBuffer.allocateDirect(10 * 1024 * 1024); s.getChannel().read(buffer); 

现在,不要尝试在字节缓冲区上调用“array()”方法; 它不适用于直接分配的缓冲区。 但是,您可以将缓冲区包装为输入流并将其发送到ObjectInputStream以进行进一步处理。