首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tomcat 9:标题行不符合RFC 7230

Tomcat 9:标题行不符合RFC 7230
EN

Stack Overflow用户
提问于 2019-10-28 15:20:24
回答 2查看 11.6K关注 0票数 3

我有一个在Tomcat 8.5.38上工作的应用程序。现在我决定升级到Tomcat9.0.27,GET请求和RFC 7230,出现了问题。

请求:

代码语言:javascript
运行
复制
/api/vehicle/power_off?vehicleId=1428714&dtStart=2019-10-21 08:00:00&dtEnd=2019-10-21 08:30:00

它从浏览器(任何IE,Opera,Chrome,FF)和另一个客户端(1C ERP系统)完美地工作。

从浏览器升级版本之后,它仍然工作得很好,但是1C没有。Tomcat显示了错误:

代码语言:javascript
运行
复制
28-Oct-2019 17:29:26.201 INFO [http-nio-8080-exec-3] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
    java.lang.IllegalArgumentException: The HTTP header line [get /api/vehicle/power_off?deviceId=1428714&dtStart=2019-10-21%2008:00:00&dtEnd=2019-10-21%2008:30:00 HTTP/1.1: ] does not conform to RFC 7230 and has been ignored.
        at org.apache.coyote.http11.Http11InputBuffer.skipLine(Http11InputBuffer.java:962)
        at org.apache.coyote.http11.Http11InputBuffer.parseHeader(Http11InputBuffer.java:825)
        at org.apache.coyote.http11.Http11InputBuffer.parseHeaders(Http11InputBuffer.java:564)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:309)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

同样的错误出现在我的开发机器(MacOS +Tomcat9.0.24)和生产服务器(Ubuntu16.04+Tomcat9.0.27)上。

原因是日期时间参数中的冒号。当我从查询字符串中删除冒号(只留下"2019-10-21 080000")时,请求将按预期工作(错误“日期时间不能解析.”)。另外,当我手动将冒号更改为"%3A“时,请求工作并返回正常结果。

然后,我将relaxedQueryChars参数添加到带有冒号的Tomcat (虽然允许冒号):

代码语言:javascript
运行
复制
relaxedQueryChars=':[]|{}^\`"<>'

但还是失败了。

8和9 Tomcat版本之间有什么区别,我的请求在8版本中工作,而在9版本中没有?在Tomcat中,我能做些什么来满足这个请求吗?更改客户端的请求是非常困难的任务.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-28 19:09:27

8和9 Tomcat版本之间有什么区别,我的请求在8版本中工作,而在9版本中没有?

我认为区别在于Tomcat 9.x已经收紧了应该允许在URL中未编码的内容,因此从技术角度看,Tomcat 9.x没有问题;问题在于Tomcat早期的版本,浏览器没有严格遵循规范。

尽管如此,我无法确定为您触发此问题的任何特定修补程序,也无法在发行说明中看到任何内容。

我将relaxedQueryChars参数添加到带有冒号(虽然允许冒号)的Tomcat中,...and仍然失败。

Tomcat9.0文档relaxedQueryChars

HTTP/1.1规范要求某些字符在URI查询字符串中使用时编码%nn。不幸的是,包括所有主要浏览器在内的许多用户代理都不符合这一规范,并以未编码的形式使用这些字符。为了防止Tomcat拒绝此类请求,可以使用此属性指定要允许的其他字符。如果未指定,则不允许使用其他字符。值可以是下列字符的任意组合:“<>\^‘{AC.26}。该值中的任何其他字符都将被忽略。

注意最后两句话。没有提到冒号字符,所以它“将被忽略”。

我能在Tomcat做些什么来满足这个要求吗?

我不这么认为,但真正的问题是,您没有在参数中编码冒号,而且您已经提到这解决了这个问题。看这个,所以回答,特别是最后一句话:

代码语言:javascript
运行
复制
There are reserved characters, that have a reserved meanings, those are delimiters — :/?#[]@ — and subdelimiters — !$&'()*+,;=

There is also a set of characters called unreserved characters — alphanumerics and -._~ — which are not to be encoded.

That means, that anything that doesn't belong to unreserved characters set is supposed to be %-encoded, when they do not have special meaning (e.g. when passed as a part of GET parameter).

冒号是具有特殊含义的保留字符,因此必须在参数中进行编码。

备注:

票数 3
EN

Stack Overflow用户

发布于 2022-01-13 05:35:16

在我的例子中,我通过在Curl请求中手动添加新的cookie来增加请求头的大小。在这样做时,使用ENTER键而不是空格。背间距&使用一个空格代替解决了这个问题。

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

https://stackoverflow.com/questions/58593645

复制
相关文章

相似问题

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