首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat 9 Http/2“错误读取请求,忽略”

Tomcat 9 Http/2“错误读取请求,忽略”
EN

Stack Overflow用户
提问于 2018-06-27 13:36:11
回答 1查看 1.8K关注 0票数 0

我正在使用tomcat 9.0.5(jdk-9.0.4+11)来服务我的请求,该请求还启用了Http/2以实现持久连接,而且我的客户端也使用了相同版本的java,我需要从客户端打开到服务器的持久连接并无限期地重用。我可以成功地从客户端连接到我的服务器并发送请求(Post和requestBody),但是在3次请求之后(正好是3次),服务器会抛出异常,如下所示,

org.apache.coyote.AbstractProtocol$ConnectionHandler.process错误读取请求,在org.apache.coyote.http2.HpackDecoder.handleIndex(HpackDecoder.java:270),org.apache.coyote.http2.HpackDecoder.decode(HpackDecoder.java:111),org.apache.coyote.http2.Http2Parser.readHeaderPayload(Http2Parser.java:418),org.apache.coyote.http2.Http2Parser.readHeadersFrame(Http2Parser.java:252),org.apache.coyote.http2.Http2Parser.readFrame(Http2Parser.java:97),org.apache.coyote忽略了java.lang.NullPointerException.http2.Http2Parser.readFrame(Http2Parser.java:69) at org.apache.coyote.http2.Http2UpgradeHandler.upgradeDispatch(Http2UpgradeHandler.java:313) at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)在org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:844)

因此,一个连接只为三个请求打开,在此之后,服务器将在此异常时关闭连接。

p.s:我正在使用httpclient-5(beta)来建立来自我的客户端的持久连接。如果queryParam/requestBody是静态内容,则连接保持持久。但是,如果queryParam/requestBody有一些动态内容(比如时间戳),那么连接就会因上述错误而关闭,我不知道post主体中的数据与tcp连接之间的关系

我不能发布我的请求体,因为这违反了政策,我会在掩盖了我所有的请求后发布,我的请求会是这样的,

代码语言:javascript
复制
String postBody = "<?xml version=\"1.0\" standalone=\"no\"?>\n" + 
                "<XX xxx=\"1000000005011\" xxx=\"true\" xxx=\"false\" xxx=\"0\" xxx=\"P|TA|D|J|M\" xxx=\"\" xxx=\"\" xxx=\"false\" xxx=\"false\" xxx=\"1\" xxx=\"true\" xxx=\"false\" xxx=\"xxx\" xxx=\"8265\"  xxx=\"true\" avgDnsTime=\"null\" xxx=\"false\" xxx=\"EVAL_USER\" xxx=\"1000000000011\" xxx=\"2\" xxx=\"true\" xxx=\"http://localhost:8080/app/xxx\" xxx=\"true\" xxx=\"false\" xxx=\"av_xxx\" ut=\"1528453675150\" xxx=\"URL\" xxx=\"70\" time=\""+(System.currentTimeMillis()+"")+"\" xxx=\"1440\" xxx=\"48\" xxx=\"1\" xxx=\"1\" postUrl=\"xxx.com:8443\">\n" + 
                "<XXX xxx=\"\" xxx=\"\" xxx=\"false\" xxx=\"\" xxx=\"1000000005011\" xxx=\"60\" xxx=\"\" xxx=\"127.0.0.1\" xxx=\"\" xxx=\"false\" xxx=\"\" xxx=\"default\" xxx=\"\" xxx=\"\" xxx=\"\" xxx=\"false\" xxx=\"false\" xxx=\"false\" xxx=\"http://www.example.com\" xxx=\"\" xxx=\"\" xxx=\"false\" m=\"G\" xxx=\"0\" xxx=\"\" xxx=\"\" t=\"30\" xxx=\"English\"><XD></XD><XH xxx=\"\" xxx=\"_sep_\" xxx=\"\"/><XI xxx=\"\" xxx=\"\"/>\n" + 
                "</XXX>\n" + 
                "</XX>";

如果有人对这一例外情况有任何了解,请帮忙。

提亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-29 08:59:11

如评论中所述

HPACK是HTTP/2中使用的HTTP标头压缩算法。因此,错误消息提示您的HTTP报头存在问题。

HTTP/1对格式错误的HTTP头非常宽容,但HTTP/2要严格得多。额外的换行符,开放的引号,额外的colons...etc。都会引起麻烦。

此外,在HTTP/2下,所有请求方法和params都考虑HTTP报头。

因此,在HTTP/1中:

代码语言:javascript
复制
GET /page.html HTTP/1.1
Header1: Header1Value
Header2: Header2Value

在HTTP/2中变成这样:

代码语言:javascript
复制
:method: GET
:path: /page.html
Header1: Header1Value
Header2: Header2Value

因此,请检查所有的标头(包括路径),以查找格式错误的请求。

在您的示例中,它是我们的:path: header中编码错误的查询Param。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51064223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档