java - 响应/浏览器中的重复 header 间歇性失败

标签 java tomcat gzip content-encoding http-content-range

这个问题似乎是几天前开始的,没有任何代码更改,我的本地 tomcat 服务器将停止响应。

我的主要过滤器断点没有命中,只有一些资源被加载。

那些失败的,似乎有重复的响应头:

Accept-Ranges:bytes
Accept-Ranges:bytes
Content-Disposition:inline;filename="online-framework.js"
Content-Disposition:inline;filename="online-framework.js"
Content-Encoding:gzip
Content-Encoding:gzip
Content-Range:bytes 0-42062/42063
Content-Range:bytes 0-42062/42063
Content-Type:application/javascript
Content-Type:application/javascript
Date:Tue, 19 Apr 2016 13:01:18 GMT
ETag:online-framework.js_42063_1461060446000
ETag:online-framework.js_42063_1461060446000
Expires:Tue, 26 Apr 2016 13:01:19 GMT
Expires:Tue, 26 Apr 2016 13:01:19 GMT
Last-Modified:Tue, 19 Apr 2016 10:07:26 GMT
Last-Modified:Tue, 19 Apr 2016 10:07:26 GMT
Server:Apache-Coyote/1.1
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
Transfer-Encoding:chunked
Vary:Accept-Encoding
Vary:Accept-Encoding

Chrome 停止并报错:Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING,这是有道理的。

tomcat 连接器没有被修改并且包含一个 gzip 响应。我尝试了什么:

  • 线程转储 - 没有明显的阻塞代码
  • wireshark - 还不够好,无法找出问题所在
  • 禁用杀毒软件
  • 没有代理运行

该页面似乎永远加载。这是踢球者,它是随机发生的,它会在一个小时开始工作,但不会在下一个小时开始工作。

我唯一能想到的是某些领域的东西可能已经改变,没有运行 Windows 更新,3 或 4 台其他电脑做同样的事情而另外 2 台没有(相同的构建)

我不知道下一步该看哪里?有什么想法吗?

最佳答案

好的,伙计们,在这里回答我自己的问题,但我找到了解决方案。

我使用的是自定义 file servlet@BalusC 撰写;问题就出在这里

这是我的发现:

  • 当使用 Content-Encoding: gzipContent-Range 的组合时出现问题
  • 产生的错误是:ERR_INCOMPLETE_CHUNKED_ENCODING
  • 我首先决定禁用这个过滤器,让 tomcat 的 DefaultServlet 处理它...问题消失了
  • 作为一名程序员,我必须知道为什么。
  • 我仍然没有确切的原因,但我认为是因为gzip不能用长度来准确表示

Content-Range 规范还指出:

The Content-Range entity-header is sent with a partial entity-body to specify where in the full entity-body the partial body should be applied. Range units are defined in section 3.12.

并且在代码中,即使是完整的响应也被发送了:

if (ranges.isEmpty() || ranges.get(0) == full) {
    // Return full file.
    Range r = full;
    response.setContentType(contentType);
    response.setHeader("Content-Range", "bytes " + r.start + "-" + r.end + "/" + r.total);

    if (content) {
        // .....

我删除了那行,然后一切又开始工作了!我真的很希望有人能参与进来,并可能给出更好的解释。

这是失败文件的 chrome://net-internals/ 输出:

t= 3740 [st=   38]     -HTTP_STREAM_REQUEST
t= 3740 [st=   38]     +HTTP_TRANSACTION_SEND_REQUEST  [dt=0]
t= 3740 [st=   38]        HTTP_TRANSACTION_SEND_REQUEST_HEADERS
                          --> GET /Core/resources/scripts/scriptaculous/dragdrop.js?t=1461139610 HTTP/1.1
                              Host: localhost:8080
                              Connection: keep-alive
                              Pragma: no-cache
                              Cache-Control: no-cache
                              Accept: */*
                              User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
                              DNT: 1
                              Referer: http://localhost:8080/Core/Dashboard?componentID=VCmq3c
                              Accept-Encoding: gzip, deflate, sdch
                              Accept-Language: en-US,en;q=0.8,af;q=0.6
                              Cookie: [306 bytes were stripped]
t= 3740 [st=   38]     -HTTP_TRANSACTION_SEND_REQUEST
t= 3740 [st=   38]     +HTTP_TRANSACTION_READ_HEADERS  [dt=4]
t= 3740 [st=   38]        HTTP_STREAM_PARSER_READ_HEADERS  [dt=4]
t= 3744 [st=   42]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                          --> HTTP/1.1 200 OK
                              Server: Apache-Coyote/1.1
                              Content-Disposition: inline;filename="dragdrop.js"
                              Accept-Ranges: bytes
                              ETag: dragdrop.js_19250_1461136271305
                              Last-Modified: Wed, 20 Apr 2016 07:11:11 GMT
                              Expires: Wed, 27 Apr 2016 08:06:51 GMT
                              Content-Range: bytes 0-19249/19250
                              Content-Type: application/javascript
                              Transfer-Encoding: chunked
                              Vary: Accept-Encoding
                              Date: Wed, 20 Apr 2016 08:06:50 GMT
t= 3744 [st=   42]     -HTTP_TRANSACTION_READ_HEADERS
t= 3744 [st=   42]      HTTP_CACHE_WRITE_INFO  [dt=56]
t= 3800 [st=   98]      HTTP_CACHE_WRITE_DATA  [dt=0]
t= 3800 [st=   98]      HTTP_CACHE_WRITE_INFO  [dt=1]
t= 3801 [st=   99]      URL_REQUEST_DELEGATE  [dt=0]
t= 3801 [st=   99]   -URL_REQUEST_START_JOB
t= 3801 [st=   99]    URL_REQUEST_DELEGATE  [dt=0]
t= 3801 [st=   99]    HTTP_TRANSACTION_READ_BODY  [dt=0]
t= 3801 [st=   99]    HTTP_CACHE_WRITE_DATA  [dt=1]
t= 3802 [st=  100]    URL_REQUEST_JOB_BYTES_READ
                      --> byte_count = 3683
t= 3802 [st=  100]    HTTP_TRANSACTION_READ_BODY  [dt=0]
t= 3802 [st=  100]    HTTP_CACHE_WRITE_DATA  [dt=0]
t= 3802 [st=  100]    URL_REQUEST_JOB_BYTES_READ
                      --> byte_count = 13982
t= 3802 [st=  100]    HTTP_TRANSACTION_READ_BODY  [dt=20365]
                      --> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING)
t=24167 [st=20465]    FAILED
                      --> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING)
t=24168 [st=20466] -REQUEST_ALIVE
                    --> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING)

最后,这里有一些真正帮助了我的链接,似乎去年 Spring 也有同样的问题。

我仍然无法弄清楚为什么在运行良好多年后会随机启动并且真的感谢任何输入。

关于java - 响应/浏览器中的重复 header 间歇性失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36719434/

相关文章:

javascript - 生产规模太大

java - 如何使用 apache arrow 在 java 中编写 Parquet 文件

java - 需要访问共享状态数据的多个监听器的正确耦合

java - 使用 gradle 将 jar 包含到集成测试中

java - 通过java程序启动tomcat startup.bat

eclipse - 如何使用 maven 在 spring mvc 项目中导入外部 *.jar?

java - Spring Pageable 不翻译@Column 名称

java - SpringJunit4ClassRunner 的类路径在哪里,如何直接指向我操作系统中的文件?

iis-7 - 为什么 IIS7 静态/动态压缩仅适用于 200 个响应?

c - 使用 libgz 来膨胀 gz 输入