【问题标题】:How to limit the maximum size read via ObjectInputStream from a Socket?如何限制通过 ObjectInputStream 从 Socket 读取的最大大小?
【发布时间】:2010-11-17 23:32:10
【问题描述】:

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

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

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

我错过了什么吗?

【问题讨论】:

    标签: java sockets serialization stream


    【解决方案1】:

    您编写了一个FilterInputStream,如果它发现它从其底层流中读取了超过一定数量的数据,它将引发异常。

    【讨论】:

    • 你太牛了!非常好的包装!
    【解决方案2】:

    我可以看到两种方式:
    1) 在循环中进行读取,抓取分配大小您满意的块,并在达到限制时退出并停止;要么 2) 分配一次最大大小的缓冲区,然后将其重新用于后续读取。

    【讨论】:

    • 非常感谢!我将使用 1 号并尝试将其包装在 Jon Skeets FilterInputStream 建议中。
    • 不客气。 Jon Skeet 的回答非常出色,imo。从“发生了什么”的角度来看,它们是等价的,但FilterInputStream 更清晰、更标准。减少车轮改造。
    【解决方案3】:

    其实,有一个非常简单的方法。

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

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

    代码:

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

    现在,不要尝试在字节缓冲区上调用“array()”方法;它不适用于直接分配的缓冲区。但是,您可以wrap the buffer as an input stream 并将其发送到 ObjectInputStream 进行进一步处理。

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 2019-12-19
      • 2021-06-08
      • 2014-05-24
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多