如何让 Tomcat 接受 URL 中未转义的括号?
Posted
技术标签:
【中文标题】如何让 Tomcat 接受 URL 中未转义的括号?【英文标题】:How can I make Tomcat accept unescaped brackets in URLs? 【发布时间】:2017-10-16 03:27:35 【问题描述】:我以前从未使用过 Tomcat,但我最近继承了一个 JSP 项目,现在我需要让它运行。我已经设法在 Eclipse 中本地安装了 Tomcat 8.0,一切正常。我还在 Ubuntu VPS 上安装了 Tomcat 8.0。该应用程序运行良好,除了处理 URL 的方式存在一个小问题。
客户端应用程序在参数中生成带有非转义方括号和大括号的 URL,如下所示:
GET /saveItems.json?items=[%22json%22:%22here%22]
尽管我想更改客户端应用程序,但我不能。我只需要让这个后端运行起来。
我的本地应用程序副本可以很好地处理这个问题。但是,在服务器上,我收到此错误:
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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:286)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1504)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1460)
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:748)
我一直在寻找可能会影响这一点的设置,但没有任何运气。我在这里错过了什么?
【问题讨论】:
【参考方案1】:Tomcat 8.0.39/8.5.9/7.0.73
在 HTTP 请求行解析中添加对有效字符的额外检查。
根据this requirement、version 8.0.42/8.5.12/7.0.76
进行一些更改以允许一些无效字符。、
和
|
如果系统属性值中存在字符则允许
tomcat.util.http.parser.HttpParser.requestTargetAllow
.
您可以添加系统属性tomcat.util.http.parser.HttpParser.requestTargetAllow=
以防止出现此错误。一种解决方案是编辑$CATALINA_HOME\conf\catalina.properties
。
【讨论】:
在 tomcat 9.0.11 + tomcat.util.http.parser.HttpParser.requestTargetAllow 中不再使用。仅使用轻松查询字符。【参考方案2】:我通过编辑 $CATALINA_HOME\conf\server.xml 使这个可行
旧值: <Connector ... protocol="HTTP/1.1"... />
新值: <Connector ... protocol="HTTP/1.1"... relaxedQueryChars='[]|^&#x5c;&#x60;&quot;&lt;&gt;' />
【讨论】:
您忘记包含值 我在 server.xml 文件中复制了上述内容以允许 #.But 仍然 tomcat 无法解析 url /跨度> 请注意,根据您的用例,您可能还想使用 RelaxedPathChars 而不是 RelaxedQueryChars。见vividcode.io/support-brackets-in-url-query-string-with-tomcat【参考方案3】:当我尝试使用某些特殊字符 GET URL
时出现此错误。
java.lang.IllegalArgumentException:在 请求目标。
通过更改server.xml
中的连接器参数,
我们能够在 Tomcat 版本 9 中解析一个特殊字符。
Connector port="80" protocol="HTTP/1.1" relaxedQueryChars="\ |"
【讨论】:
【参考方案4】:我也遇到了类似的问题,但也使用 Spring boot,以下解决方案解决了我的问题:
@Bean
public ConfigurableServletWebServerFactory webServerFactory()
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer()
@Override
public void customize(Connector connector)
connector.setProperty("relaxedQueryChars", "|[]");
);
return factory;
归功于Matthias-lohr - https://***.com/questions/46251131/invalid-character-found-in-the-request-target-in-spring-boot
【讨论】:
以上是关于如何让 Tomcat 接受 URL 中未转义的括号?的主要内容,如果未能解决你的问题,请参考以下文章
数据 URI 正文中未转义的“#”字符已弃用;如何在项目中找到?
如何让 Apache Tomcat 接受 DELETE 方法
springboot中URL带有斜杠的转义字符百分之2F导致的400错误