java - 如何读取超时的HttpServletRequest数据?

标签 java servlets httprequest inputstream

当我收到HttpServletRequest时我得到ServletInputStream并使用 readLine 逐行读取请求正文。现在我想知道如果客户端非常慢并且我希望 readLine 在超时后返回怎么办。

我也许可以安排一个TimerTask来中断readLine并捕获InterruptedException。是否有意义?您是否会建议另一种解决方案来读取超时的 HTTP 请求正文?

最佳答案

您可以从流中实现您自己的“紧密”读取(较小的 bufferSize 值,例如一次 8 个字节)而不是 readLine 并在迭代中断言超时。 除此之外,当您阻塞 IO 时(在下面示例中的 in.read 调用中被阻塞),您不能做太多事情。当线程在 IO 上被阻塞时,它不会对中断使用react。

long timeout = 30000l; //30s
int bufferSize = 8;
ByteArrayOutputStream out = new ByteArrayOutputStream(bufferSize);
try {
    long start = System.currentTimeMillis();
    int byteCount = 0;
    byte[] buffer = new byte[bufferSize];
    int bytesRead = -1;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
        byteCount += bytesRead;
        if (System.currentTimeMillis() > start + timeout) {
            //timed out: get out or throw exception or ....
        }
    }
    out.flush();
    return byteCount;
} ... catch ... finally ....

关于java - 如何读取超时的HttpServletRequest数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18551818/

相关文章:

Javafx - 我无法将数据放入 TableView

java - 激活 Gitlab 以构建项目并运行测试的 .gitlab-ci.yml 文件应该是什么?

java - 使用复杂模型且无需类型检查和 if-else 链来实现 MVC 的正确方法

java - 安卓菜单和子菜单

java - Servlet 映射 : url-pattern for URLs with trailing slash

javascript - 了解 Express.js 中间件优先级

c# - 如何在 HTTP 请求正文中包含语音标记(双引号)

java - 为什么session的3个参数中有1个为null(Java),但在servlet中不为null

java - 简单的登录页面

Swift Http 客户端不发送请求