我有一个应用程序在Tomcat 8.5.38上运行良好。现在我决定升级到Tomcat 9.0.27,但GET请求和RFC 7230,超文本传输协议(HTTP/1.1):消息语法和路由出现问题。
请求如下:
/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显示以下错误:
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 + Tomcat 9.0.24)和生产服务器(Ubuntu 16.04 + Tomcat 9.0.27)上都遇到了同样的错误。
导致这个错误的原因是日期时间参数中的冒号。当我从查询字符串中删除冒号(只留下“2019-10-21 080000”)时,请求按预期工作(出现“无法解析日期时间”的错误)。另外,当我手动将冒号更改为“%3A”时,请求也可以正常返回结果。
然后我在Tomcat Connector中添加了relaxedQueryChars参数来允许冒号(尽管冒号是被允许的符号):
relaxedQueryChars=':[]|{}^\`"<>'
它仍然失败。
在Tomcat 8和9版本之间,我的请求能够在8中正常工作,但在9中却不行。在Tomcat中是否有任何我可以做的事情来使该请求成功?更改客户端请求很困难...