Tomcat 8 无法使用“\|”处理获取请求在查询参数中?

新手上路,请多包涵

我正在使用 Tomcat 8。在一种情况下,我需要处理来自外部源的外部请求,其中请求有一个参数,它由 | 分隔。

请求看起来像这样:

http://localhost:8080/app/handleResponse?msg=name|id|

在这种情况下,我收到以下错误。

 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:667)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

编辑 1

它适用于 Apache Tomcat 8.0.30,但不适用于 Tomcat 8.5

原文由 ashishjmeshram 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 870
2 个回答

所有主要的 Tomcat 版本都引入了这种行为:

  • 雄猫 7.0.73、8.0.39、8.5.7 _

要修复,请执行以下操作之一:

  • 设置 relaxedQueryChars 允许这个字符(推荐, 见林肯的回答
  • 设置 requestTargetAllow 选项(在 Tomcat 8.5 中已弃用)( 请参阅 Jérémie 的回答)。
  • 您可以降级到旧版本之一(不推荐 - 安全性)

根据 changelog ,这些更改可能会影响此行为:

雄猫 8.5.3:

确保 HTTP 方法名称不是令牌的请求(按照 RFC 7231 的要求)被拒绝并返回 400 响应

雄猫 8.5.7:

在 HTTP 请求行解析中添加对有效字符的额外检查,以便更快地拒绝无效的请求行。


最好的选择(遵循标准) - 你想在客户端对你的 URL 进行编码:

 encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|")
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C

或者只是查询字符串:

 encodeURIComponent("msg=name|id|")
> msg%3Dname%7Cid%7C

它将保护您免受其他有问题的字符( 无效 URI 字符列表)的影响

原文由 Piotr Lewandowski 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 Tomcat 7.0.768.0.428.5.12 开始,您可以定义属性 requestTargetAllow 以允许使用禁止字符。

在你的 catalina.properties 中添加这一行

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

原文由 Jérémie Lesage 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题