如何在Tomcat 8.5中允许URL中的^字符。

18

我有一个以下格式的请求URL:

http://hostname:port/path&param1={"vars":[{"a":"val1","b":"^"},{"c":"val2","d":"^"}]}&param2=Value3|95|3%20-%206%20Months

根据这个stackoverflow问题,我修改了catalina.properties文件。

但是根据tomcat文档tomcat.util.http.parser.HttpParser.requestTargetAllow属性已经被弃用,应该使用Connector标签中的relaxedPathCharsrelaxedQueryChars属性。

然而,当我将xml文件更改为以下内容时:

 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" relaxedQueryChars="^" relaxedPathChars="^"/>

当我使用字符^时,仍然会收到400错误请求。

我不确定这是否是正确的配置。

2个回答

45
最好在将请求发送到服务器之前,始终对查询参数进行URL编码。阅读:https://www.talisman.org/~erlkonig/misc/lunatech%5Ewhat-every-webdev-must-know-about-url-encoding/ 如果您想采用relaxedQueryChars方法,请注意您的查询中以下字符也应添加到例外集合中: " { } [ ] ^ |
请尝试在您的server.xml文件中添加以下内容: 关于relaxedQueryChars/relaxedPathChars的更多信息,请参考bug ticket 62273。此更改已添加到Tomat的所有分支中。
  • 9.0.8
  • 8.5.31
  • 8.0.52
  • 7.0.87
我认为你根本不需要relaxedPathChars属性(这是指URL路径上的字符)。然而,Tomcat团队的测试结果似乎表明以下内容可用于最大限度地保持向后兼容性: relaxedPathChars='[]|' relaxedQueryChars='[]|{}^&#x5c;&#x60;&quot;&lt;&gt;' 注意/你查询的第一个参数应该用?而不是&来标记。 http://hostname:port/path?param1=...&param2=...&param3=...

2
谢谢回答。不过我已经发现,在Tomcat 8.5.x系列的版本中,支持relaxedQueryChars。 - Sachin Kumar

6

需要使用Unicode而不是文字字符<>。这是我在server.xml中实际拥有的relaxedQueryChars值:

relaxedQueryChars="&#x5B;&#x5D;&#x7C;&#x7B;&#x7D;&#x5E;&#x5C;&#x60;&#x22;&#x3C;&#x3E;"
&#x5B; -> [
&#x5D; -> ]
&#x7C; -> |
&#x7B; -> {
&#x7D; -> }
&#x5E; -> ^
&#x5C; -> \
&#x60; -> `
&#x22; -> "
&#x3C; -> <
&#x3E; -> >

这只有在手动编辑server.xml文件时才会生效。任何试图读写该文件的尝试都将破坏文件。 - user3911119

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接